我有这个管道:
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
我的管道出了什么问题?队列元素的作用是什么?我还没有真正理解它在文档中所说的内容。
答案 0 :(得分:11)
queue元素为管道添加线程边界并支持缓冲。输入端将缓冲区放入队列,然后在另一个线程的输出端清空。通过队列元素上的属性,您可以设置队列的大小和其他一些东西。
我没有看到你的管道有什么特别的错误,但那里的消息告诉你,在某个时刻,其中一个队列是空的。这可能是一个问题。它可能会在以后再次变得更充实。
您必须检查GStreamer调试日志,看看是否有任何暗示实际问题的内容。我最好的猜测是,由于x264enc的编码器延迟,音频队列运行完全。尝试将音频队列放大,或在x264enc上设置tune = zerolatency。
此外,我发现你正在使用GStreamer 0.10。它已不再维护超过两年,对于新的应用程序,您应该考虑升级到1.x版本。
答案 1 :(得分:0)
队列是线程边界元素,您可以通过它强制使用线程。它通过使用世界各地大学的线程类中学习的经典提供者/消费者模型来实现。通过这样做,它既可以作为线程之间的数据吞吐量线程安全的手段,也可以充当缓冲区。队列有几个GObject属性要配置用于特定用途。例如,您可以为元素设置下限和上限。如果数据少于下限阈值(默认值:禁用),则会阻止输出。如果有比上限阈值更多的数据,它将阻止输入或(如果配置为这样)丢弃数据。
要使用队列(因此强制在管道中使用两个不同的线程),可以简单地创建一个“队列”元素并将其作为管道的一部分。 GStreamer将在内部处理所有线程细节。