【问题标题】:What the queue element do in Gstreamer pipeline队列元素在 Gstreamer 管道中的作用
【发布时间】:2017-11-20 00:58:37
【问题描述】:

我有这个管道:

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

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

【问题讨论】:

    标签: gstreamer


    【解决方案1】:

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

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

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

    我还看到您使用的是 GStreamer 0.10。两年多以来不再维护它,对于新应用程序,您真的应该考虑升级到 1.x 版本。

    【讨论】:

    • 谢谢,这是否意味着“队列”之后的所有内容都在新线程中运行?我认为这意味着不要过度使用“队列”?
    【解决方案2】:

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

    要使用队列(并因此强制在管道中使用两个不同的线程),可以简单地创建一个“队列”元素并将其作为管道的一部分放入。 GStreamer 将在内部处理所有线程细节。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多