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

时间:2016-05-24 14:05:22

标签: video concatenation gstreamer

美好的一天,

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

换句话说,以下管道连接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.

像魅力一样!但是,我需要重新编码,然后将多路复用的视频和音频流重新编码,然后将它们写入一个容器(即应该有一个" filesink位置= c.mp4"而不是autovideosink和alsasink。管道如果我理解正确的话 - 这样我会收到a.mp4的内容,附上b.mp4的内容(a.mp4 + b.mp4 = c.mp4)

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

1 个答案:

答案 0 :(得分:1)

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

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,有-e开关用于gst-launch导致将EOS发送到管道,从而正确结束mp4muxing进程..否则将不会写入元数据

2,管道不会自动结束..这是你可以调整的东西..也许是concat或某些东西的某些属性..也许尝试添加streamynchronizer - 但我没有成功使用那个。我不确定我是否将它放在concat之后或之前...也许你可以在IRC上询问

3,我该如何建造这样的管道?

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

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

C,对于视频,我最喜欢的是video / x-h264 ..所以我选择了一直用于视频的旧版x264enc。我想也许我需要有h264parse但不需要它。

4,然后将所有内容捆绑在一起..请记住,您可以使用name=something(它与别名完全相同)的方式提供元素名称,但您不能仅将其用作something,而是您之后需要pu点所以something.

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

6,为了简化它..输入处理然后decodebin产生两个分支 - 音频和视频..每种类型转到正确的concat ..有两个concats - 每个都有自己的处理类型(视频有videoconvert等等..那么那两个concat分支经过编码并且在编码之后它们以mp4mux结束..在mux之后只有filesink ..这就是全部