gstreamer:concat 后将视频和音频流写入单个 MP4 容器

gstreamer: write both video and audo streams into a single MP4 container after concat

美好的一天,

我有两个 mp4 文件(a.mp4 和 b.mp4),每个文件都包含视频和音频流,我需要使用 gstreamer 将它们连接到一个 mp4 容器 (c.mp4) 中(这个问题连接到 )

换句话说,下面的流水线连接了a.mp4和b.mp4的内容,然后将结果输出到autovideosink和alsasink:

GST_DEBUG=3 gst-launch-1.0 concat name=c2 ! videoconvert ! videorate ! autovideosink concat name=c ! audioconvert ! audiorate ! alsasink filesrc location=a.mp4 ! decodebin name=d1 ! audio/x-raw ! queue ! c. filesrc location=b.mp4 ! decodebin name=d2 ! audio/x-raw ! queue ! c. d1. ! video/x-raw ! queue ! c2. d2. ! video/x-raw ! queue ! c2.

工作起来很有魅力!但是我需要重新编码然后复用连接的视频和音频流,而不是 autovideosink 和 alsasink,并将它们写入单个容器(即,如果我理解正确的话,管道中应该有一个 "filesink location=c.mp4")-这样我会收到 a.mp4 的内容附加 b.mp4 的内容 (a.mp4 + b.mp4 = c.mp4)

有人可以分享一个演示如何执行此操作的管道吗?

好吧,至少你提到了 filesink .. 但你应该总是 post 你拥有的东西(有些还没有工作管道..)无论如何这是神奇的管道:

gst-launch-1.0 -e concat name=c2 ! videoconvert ! x264enc tune=4 ! mp4mux name=mp4 ! filesink location=out.mp4 concat name=c ! audioconvert ! voaacenc ! mp4. filesrc location=big.mp4 ! decodebin name=d1 ! audio/x-raw ! queue ! c. filesrc location=big2.mp4 ! decodebin name=d2 ! audio/x-raw ! queue ! c. d1. ! video/x-raw ! queue ! c2. d2. ! video/x-raw ! queue ! c2.

顺便说一句,您可能想阅读有关 gst-launch

的内容

请注意以下几点:

1,gst-launch 有 -e 开关,这会导致将 EOS 发送到管道,从而正确结束 mp4muxing 进程。否则将不会写入元数据

2,管道不会自动结束..这是您可以调整的东西..可能是 concat 的某些属性或其他东西..也许尝试添加 streamsynchronizer - 但我没有成功。我不确定我应该把它放在 concat 之后还是之前.. 也许你可以在 IRC

上问问

3、如何搭建这样的管道?

A,首先我检查了 mp4mux 的功能,因为我知道我想要 mux mp4..(如果你在 Linux 上,你可以输入 gst-inspect-1.0 | grep mp4 | grep mux 来找到它)。您必须记住元素的 src is the output 和 sink 是输入(有时这样想不是很自然.. 请记住 sink 是您洗手时水结束的地方 :D )。所以我们希望有音频接收器和视频接收器..

B,我选择的音频可能性很小 audio/mpeg... 然后我记得 mp4 有时使用 aac.. 然后我搜索了 aac 编码器,它是 voaacenc.. 我检查了 src 上限和确实是 audio/mpeg(版本 4)

C,对于视频,我最喜欢 video/x-h264 ..所以我使用了很好的旧 x264enc,我一直使用它来制作视频..我想也许我需要 h264parse 但它不是需要..

4,然后将所有东西捆绑在一起.. 请记住,您可以使用 name=something(它与别名完全一样)的方式给元素命名,但您不只是将其用作 something但是你之后需要 pu 点所以它 something.

5,还请记住,将元素放入 gst-launch 的顺序更多地是关于 linking 而不是它是如何处理的。想想你所需要的只是 link元素 .. 然后想想处理本身。您可以将 *sink 元素放在管道的开头,但您必须给它们命名并在其他地方使用该名称(例如像我一样在 mux 之后)

6,为了简化它.. 输入处理然后 decodebin 产生两个分支 - 音频和视频.. 每种类型都进行适当的连接.. 有两个连接 - 每个都有自己的处理类型(对于视频有是 videoconvert 等).. 然后这两个 concat 分支经过编码,编码后它们在 mp4mux 结束.. 在 mux 之后只有 filesink.. 就是这样