gstreamer中的实时源文件已损坏



我在GStreamer中有一个从实时源(网络摄像头)和伪实时源(屏幕截图)编写的文件问题。生成的文件没有时间长度,因此根本无法在Media Player Classic中播放。它们确实可以在Firefox中播放,但没有时间长度,有时速度会加快。

我使用什么(伪)活动源,什么编解码器或容器似乎都无关紧要。故事总是一样的;没有设定时间长度的媒体文件不正确。

然而,当我将选项"num-buffers=100"添加到dx9screenapsrc时,src元素在缓冲区数量之后发送EOS事件,然后文件在MPC和Firefox中正确呈现。所以EOS事件似乎做了一些事情,使文件被正确关闭。

我尝试了常用的方法来停止管道(通过setState(…))。尝试手动向所有元素发送EOS事件,在总线上侦听EOS事件,然后退出管道。所有这些都无济于事,文件仍然是损坏的。

我的问题是,如何在使用(伪)实时源并生成正确的文件(即在这种情况下,具有正确的时间长度)时停止管道。

我使用GStreamer - Java与GStreamer 0.10在Java 6和Windows 8。以下面的管道为例:

dx9screencapsrc ! video/x-raw-rgb,framerate=15/1 ! ffmpegcolorspace ! vp8enc ! webmmux ! filesink location=%s
在这一点上,我不知道如何解决这个问题。任何帮助都非常感谢!

事实证明,我只能将EOS事件发送到src元素,而不是发送到管道中的每个元素。

正确的方法是将EOS事件发送到管道,然后等待,直到您在总线上以GstMessage的形式获得它。

如果你说你已经尝试过了,但它不起作用,它可能是所涉及的元素(不太可能),java绑定或代码中的错误。

为了排除相关元素中的bug,我建议尝试:

gst-launch-0.10 -e dx9screencapsrc ! video/x-raw-rgb,framerate=15/1 ! ffmpegcolorspace ! vp8enc ! webmmux ! filesink location=%s

-e标志将启用EOS -on-shutdown,这意味着一旦您中断进程,它将发送EOS并在总线上等待它(就像您的应用程序应该做的那样)。如果可以的话,我建议你检查一下你的代码。

重要的是要注意,您正在使用的gstreamer 0.10现在已经过时3年并且没有维护。强烈建议移动到1。x系列。

最新更新