2015-05-26 58 views
0

我在使用GStreamer中的实时来源(网络摄像头)和pseuso-live来源(屏幕截图)编写的文件时遇到问题。生成的文件没有时间长度,因此在Media Player Classic中完全不能播放。他们确实在Firefox中玩,但没有时间长度,有时速度也会提高。gstreamer中生成文件的文件已损坏

它似乎并不关系我使用什么(伪)活源,也不是什么编解码器或容器。故事总是一样的;不正确的媒体文件,没有设置时间长度。

但是,当我向dx9screencapsrc添加选项“num-buffers = 100”时,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 

在这一点上,我在一个头绪解决这个问题。任何帮助是极大的赞赏!

FIXED 事实证明,我不得不把EOS事件发送到src元素,而不是在管道中的每一个元素。

回答

0

正确的方法是将EOS事件发送到管道,然后等到您将其作为总线上的GstMessage。

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

为了排除错误的参与元素我建议尝试:

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

-e标志将使EOS-在关机,这意味着一旦中断过程中它会发送EOS等待在公共汽车上(就像你的应用程序应该这样做)。如果这有效,我建议您查看您的代码。

重要的是要注意,你正在使用现在已经过时3年并且已经过滤的gstreamer 0.10。强烈建议转向1.x系列。

+0

感谢您的回答!事实证明,我必须将EOS事件_only_发送到src元素,而不是管道中的每个元素。显然,那是我的错误。 如您所述,-e选项可以在命令行上正常工作。 我们想要使用gstreamer 1.x,但是,我们尝试过的任何java绑定都不起作用。或者至少不适合我们。尽管如此,我们一定会再次考虑它。 –

+0

您不需要将EOS自己发送到元素,只需将eos直接发送到管道对象,流水线就会知道如何处理该事件。 – thiagoss