2014-10-27 52 views
3

做什么,我有这样的管道:队列元素GStreamer的管道

gst-launch -v filesrc location=video.mkv ! matroskademux name=d \ 
d. ! queue ! ffdec_h264 ! subtitleoverlay name=overlay ! ffmpegcolorspace ! x264enc ! mux. \ 
d. ! queue ! aacparse ! mux. \ 
filesrc location=fr.srt ! subparse ! overlay. \ 
matroskamux name=mux ! filesink location=vid.mkv 

我试图字幕刻录成视频。我已经succdeded读取与字幕,但上面的管道卡住的文件,我有这样的消息:

queue_dataflow gstqueue.c:1243:gst_queue_loop:<queue0> queue is empty 

这有什么错我的管道?队列元素的作用是什么?我还没有真正理解它在文档中的意思。

回答

6

队列元素将线程边界添加到管道并支持缓冲。输入端会将缓冲区放入队列中,然后在另一个线程的输出端清空队列。通过队列元素的属性,你可以设置队列的大小和其他一些东西。

我没有看到你的管道有什么特别的问题,但是那里的消息告诉你在某个点上有一个队列是空的。这可能是一个问题或不是。稍后它可能会变得更加饱满。

您必须检查GStreamer调试日志以查看是否有任何内容暗示实际问题。我最好猜测的是,由于x264enc的编码器延迟,音频队列会运行完整。尝试使音频队列变大,或在x264enc上设置tune = zerolatency。

另外我看到你正在使用GStreamer 0.10。它已经超过两年不再维护,对于新的应用程序,您应该考虑升级到1.x版本。

+0

谢谢,这是否意味着“队列”后面的所有内容都在新线程中运行?我认为这意味着不要过度“排队”? – 2016-09-24 12:57:54

0

队列是可以通过其强制使用线程的线程边界元素。它通过使用全球大学的线程课程中学习的经典提供者/消费者模型来实现。通过这样做,它既可以作为使线程间线程安全的数据吞吐量的手段,也可以充当缓冲区。队列有几个GObject属性要配置用于特定用途。例如,您可以设置元素的上限和下限。如果数据少于下限(默认值:禁用),则会阻止输出。如果数据超过上限阈值,则会阻止输入或(如果配置为这样)丢弃数据。要使用一个队列(并因此强制使用流水线中的两个不同的线程),可以简单地创建一个“队列”元素,并将其作为流水线的一部分。 GStreamer将在内部处理所有线程细节。