gstreamer 中来自实时源的文件已损坏

Files from live sources in gstreamer are corrupt

我在使用 GStreamer 中的实时源(网络摄像头)和伪实时源(截屏)写入的文件时遇到问题。生成的文件没有时间长度,因此根本无法在 Media Player Classic 中播放。他们在 Firefox 中玩,但没有时间长度,有时速度更快。

我使用什么(伪)直播源似乎并不重要,无论是什么编解码器或容器。故事总是一样的;没有设置时间长度的错误媒体文件。

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

我已经尝试了停止管道的常用方法(通过 setState(...))。尝试手动向所有元素发送 EOS 事件,监听总线上的 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 元素,而不是管道中的每个元素。

正确的方法是将 EOS 事件发送到管道并等待,直到您在总线上将其作为 GstMessage 获取。

如果您说您已经尝试过但没有成功,则可能是相关元素(不太可能)、java 绑定或您的代码中的错误。

要排除相关元素中的错误,我建议您尝试:

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系列