美好的一天,
我有两个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)
有人可以分享一个演示如何执行此操作的管道吗?
答案 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 ..这就是全部