首页 > 解决方案 > Gstreamer 转码流水线 1 个源 N 个接收器

问题描述

大家好,我有一个想要转换为 mp4、ogg 和 webm 的 mkv

我尝试关注管道但卡住了

gst-launch-1.0 filesrc location=output.mkv ! matroskademux name=demux demux.video_0 ! jpegparse ! jpegdec ! tee name=vo \
oggmux name=ogg ! filesink location=output.ogg \
qtmux name=mp4 ! filesink location=output.mp4 \
webmmux name=webm ! filesink location=output.webm \
vo. ! queue ! videoconvert ! vp8enc ! progressreport update-freq=1 ! webm. \
vo. ! queue ! videoconvert ! x264enc ! progressreport update-freq=1 ! mp4.  \
vo. ! queue ! videoconvert ! theoraenc ! progressreport update-freq=1 ! ogg. 

输出

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
Redistribute latency...
progressreport2 (00:00:01): 0 seconds
progressreport2 (00:00:02): 0 seconds
progressreport0 (00:00:02): 0 seconds

从我所看到的队列有问题,bc它只识别2个并且应该有3个此外,如果我从管道中删除一个队列,似乎工作得很好

IE

gst-launch-1.0 filesrc location=output.mkv ! matroskademux name=demux demux.video_0 ! jpegparse ! jpegdec ! tee name=vo \
oggmux name=ogg ! filesink location=output.ogg \
webmmux name=webm ! filesink location=output.webm \
vo. ! queue ! videoconvert ! vp8enc ! progressreport update-freq=1 ! webm. \
vo. ! queue ! videoconvert ! theoraenc ! progressreport update-freq=1 ! ogg. 

输出

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
progressreport1 (00:00:01): 0 seconds
progressreport0 (00:00:02): 0 seconds
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
progressreport1 (00:00:02): 0 seconds
progressreport1 (00:00:03): 0 seconds
progressreport1 (00:00:04): 0 seconds
progressreport1 (00:00:05): 0 seconds
progressreport1 (00:00:06): 0 seconds
progressreport0 (00:00:08): 0 seconds
progressreport1 (00:00:09): 0 seconds

请指教

问候

标签: gstreamertranscoding

解决方案


x264enc默认情况下,延迟高于默认队列大小,导致管道停止。(它必须消耗比当前实际创建输出缓冲区更多的数据。这样管道将永远不会完成预滚动)。

两种选择:

  • 增加所有队列的队列大小的缓冲区大小。
  • 用于x264enc tune=zerolatency您的编码器。

推荐阅读