队列元素在Gstreamer管道中的作用

队列元素在Gstreamer管道中的作用,gstreamer,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. \ matr

我有这个管道:

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
我想把字幕烧掉。我已成功阅读带有字幕的文件,但上面的管道卡住了,我收到以下消息:

queue_dataflow gstqueue.c:1243:gst_queue_loop:<queue0> queue is empty
queue_数据流gstqueue.c:1243:gst_queue_循环:队列为空

我的管道怎么了?队列元素做什么?我还没有真正理解文档中的内容。

队列元素为管道添加了线程边界并支持缓冲。输入端将缓冲区放入队列,然后从另一个线程在输出端清空队列。通过队列元素上的属性,您可以设置队列的大小和其他一些内容

我看不出您的管道有什么特别的问题,但是那里的消息告诉您,在某个点上,其中一个队列是空的。这可能是个问题,也可能不是。以后它可能会变得更满

您必须检查GStreamer调试日志,以查看其中是否有任何提示实际问题的内容。我最好的猜测是,由于x264enc的编码器延迟,音频队列已满。尝试增大音频队列,或在x264enc上设置tune=zerolatency


我还看到您正在使用GStreamer 0.10。从两年多开始,它不再被维护,对于新的应用程序,你应该考虑升级到1。x版本。

< P>队列是线程边界元素,通过它可以强制使用线程。它通过使用一个经典的提供者/消费者模型来实现这一点,正如在世界各地大学的线程课程中所学到的那样。通过这样做,它既可以作为使线程之间的数据吞吐量线程安全的手段,也可以作为缓冲区。队列具有多个GObject属性,可针对特定用途进行配置。例如,可以为元素设置下限和上限阈值。如果数据少于下限阈值(默认值:禁用),它将阻止输出。如果有超过上限阈值的数据,它将阻止输入或(如果配置为这样做)丢弃数据


要使用队列(从而强制在管道中使用两个不同的线程),只需创建一个“queue”元素并将其作为管道的一部分放入即可。GStreamer将在内部处理所有线程细节。

谢谢,这是否意味着“队列”之后的所有内容都在新线程中运行?我认为这意味着不会超过“排队”?