我在使用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元素,而不是在管道中的每一个元素。
感谢您的回答!事实证明,我必须将EOS事件_only_发送到src元素,而不是管道中的每个元素。显然,那是我的错误。 如您所述,-e选项可以在命令行上正常工作。 我们想要使用gstreamer 1.x,但是,我们尝试过的任何java绑定都不起作用。或者至少不适合我们。尽管如此,我们一定会再次考虑它。 –
您不需要将EOS自己发送到元素,只需将eos直接发送到管道对象,流水线就会知道如何处理该事件。 – thiagoss