我对从 GStreamer 中的实时源(网络摄像头)和伪实时源(截屏)写入的文件有疑问。生成的文件没有时间长度,因此根本无法在 Media Player Classic 中播放。他们确实在 Firefox 中播放,但没有时间长度,有时速度更快。
我使用什么(伪)实时源,或者什么编解码器或容器似乎并不重要。故事总是一样的;没有设定时间长度的错误媒体文件。
但是,当我将选项“num-buffers=100”添加到 dx9screencapsrc 时,src 元素会在该数量的缓冲区之后发送一个 EOS 事件,然后文件在 MPC 和 Firefox 中正确呈现。所以 EOS 事件似乎做了一些事情,以便文件被正确关闭。
我已经尝试过停止管道的常用方法(通过 setState(...))。尝试手动向所有元素发送 EOS 事件,在 Bus 上监听 EOS 事件,然后退出管道。一切都无济于事,文件仍然损坏。
我的问题是,如何在使用(伪)实时源并生成正确的文件时停止管道(即在这种情况下,具有正确的时间长度)。
我在 Java 6 和 Windows 8 上使用 gstreamer-java 和 GStreamer 0.10。以以下管道为例:
dx9screencapsrc ! video/x-raw-rgb,framerate=15/1 ! ffmpegcolorspace ! vp8enc ! webmmux ! filesink location=%s
在这一点上,我不知道如何解决这个问题。任何帮助是极大的赞赏!
已修复 事实证明,我必须将 EOS 事件仅发送到 src 元素,而不是发送到管道中的每个元素。