0

我对从 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 元素,而不是发送到管道中的每个元素。

4

1 回答 1

1

正确的方法是将 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 系列。

于 2015-05-27T08:47:18.420 回答