Gstreamer 管道多个接收器到一个 src

Gstreamer pipeline multiple sink to one src

寻找有关如何在一个模块中混合两个输入方面使用命名元素的说明。例如在一个 mpegtsmux 模型中混合音频和视频

gst-launch filesrc location=surround.mp4 ! decodebin name=dmux ! queue ! audioconvert ! lamemp3enc dmux. ! queue ! x264enc ! mpegtsmux name=mux ! queue ! filesink location=out.ts

上面的管道给出了如下所示的插件互连

所以它显示音频没有连接到 mpegtsmus。

如何修改命令行以在 mpegtsmux 中进行音频和视频混合?

谢谢!

未 link 编辑,因为您的启动行没有这样做。请注意 lamemp3enc 元素如何不 link 下游。

将您的发布行更新为:

gst-launch filesrc location=surround.mp4 ! decodebin name=dmux ! queue ! audioconvert ! lamemp3enc ! mux. dmux. ! queue ! x264enc ! mpegtsmux name=mux ! queue ! filesink location=out.ts

唯一的变化是“!mux”。在 lamemp3enc 之后告诉它 link 到 mpegtsmux。

在更新内容时,请注意您使用的 gstreamer 0.10 已经过时且无人维护,请升级到 1.x 系列以获得最新的改进和错误修复。

我会尝试给出基本的想法,虽然我不是那么精通并且可能是完全错误的。

  • 一个管道可以由多个子管道组成。如果某个元素 (bin) 不是以管道 (!) 结束,而是以另一个元素开始,那么它就是一个新的子管道:filesrc location=a.mp4 ! qtdemux name=demp4 demp4. ! something
  • 一个命名的 bin(通常是一个 muxer),或者它的 padssomedemux.audio_00 可以是一个源 and/or 其他子管道中的一个接收器:demp4. ! queue ! decodebin ! x264enc ! mux.
  • 通常,子管道以命名的 bin/muxer 结尾,声明为:mpegtsmux name=mux 或通过名称引用:mux. 末尾的点是引用的语法。
  • 然后命名的 muxer 可以通过管道传输到另一个子管道中的接收器:mux. ! filesink location=out.ts
  • 如果您只使用来自源的唯一音频或视频流,则不必像 muxname.audio_00 那样指定 pad。 muxname."suitable audio/video pad from muxname".
  • 的快捷方式

例子

也就是说,我假设您的 mp4 文件既有音频又有视频。在这种情况下,您需要先将其解复用为 2 个流,解码、重新编码,然后将它们复用回来。

确实,您的音频未连接到 mpegtsmux

如果你真的需要解码流,那是我会做的。不过,这对我不起作用:

gst-launch-1.0 filesrc location=surround.mp4 ! \
  qtdemux name=demp4 \
  demp4. ! queue ! decodebin ! audioconvert ! lamemp3enc ! mpegtsmux name=mux \
  demp4. ! queue ! decodebin ! x264enc ! mux. \
  mux. ! filesink location=out.ts

或者让我们使用 decodebin 神奇地解码两个流:

gst-launch-1.0 filesrc location=surround.mp4 ! \
  decodebin name=demp4 \
  demp4. ! queue ! audioconvert ! lamemp3enc ! mpegtsmux name=mux \
  demp4. ! queue ! x264enc ! mux. \
  mux. ! filesink location=out.ts