ffmpeg拼接視頻方法concat詳解

ffmpeg合併視頻的方法有三種。

方法一.使用concat協議進行視頻文件的合併

    1.對於 MPEG 格式的視頻,可以直接連接:

    //視頻尺寸要一致

    ffmpeg -i concat:"1.mpg|2.mpg|3.mpg" -c copy output.mp4

    2.對於非 MPEG 格式容器,但是是 MPEG 編碼器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包裝進 TS 格式的容器再合併。在新浪視頻,有很多視頻使用 H.264 編碼器,可以採用這個方法(視頻尺寸可以不一致)

    ts全稱爲MPEG2-TS。ts即"Transport Stream"的縮寫。MPEG2-TS格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的。

    ffmpeg -i 1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1.ts

    ffmpeg -i 2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2.ts

    ffmpeg -i 3.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 3.ts

    ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart ts.mp

    保存 QuickTime/MP4 格式容器的時候,建議加上 -movflags +faststart。這樣分享文件給別人的時候可以邊下邊看。

方法二:FFmpeg concat 分離器

    這種方法成功率很高,也是最好的,但是需要 FFmpeg 1.1 以上版本。先創建一個文本文件filelist.txt:

    file 'input1.mkv'

    file 'input2.mkv'

    file 'input3.mkv'

    然後:

    ffmpeg -f concat -i filelist.txt -c copy output.mkv

    注意:使用 FFmpeg concat 分離器時,如果文件名有奇怪的字符,要在 filelist.txt 中轉義

    測試了一下,不同尺寸的視頻可以正常合成,但是不同格式的合成有問題

方式三:使用concat濾鏡(filter)進行視頻文件的合併:

    ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]’  output.mp4

    上面的命令合併了三種不同格式的文件,FFmpeg concat 過濾器會重新編碼它們。注意這是有損壓縮。

    [0:0] [0:1] [1:0] [1:1] [2:0] [2:1] 分別表示第一個輸入文件的視頻、音頻、第二個輸入文件的視頻、音頻、第三個輸入文件的視頻、音頻。concat=n=3:v=1:a=1 表示有三個輸入文件,輸出一條視頻流和一條音頻流。[v] [a] 就是得到的視頻流和音頻流的名字,注意在 bash 等 shell 中需要用引號,防止通配符擴展。

    測試了一下,不同格式正常,不同尺寸會報錯。

參考http://trac.ffmpeg.org/wiki/Concatenate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章