使用ffmpeg合并视频文件的三种方法
生活随笔
收集整理的這篇文章主要介紹了
使用ffmpeg合并视频文件的三种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ffmpeg合并視頻的方法有三種。國內大多數僅介紹了其中之一。于是覺得有必要翻譯一下。其實在ffmpeg的?FAQ文檔中有比較詳細的說明。
??使用concat協議進行視頻文件的合并
這種方式的適用場景是:視頻容器是MPEG-1, MPEG-2 PS或DV等可以直接進行合并的。換句話說,其實可以直接用cat或者copy之類的命令來對視頻直接進行合并。很多文章介紹了這種方法,但適用性卻沒有提及。這并不是一個通用的方法。典型的命令示例如下:
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg??使用concat demuxer進行視頻文件的合并
這種合并方式的適用場景是:當容器格式不支持文件層次的合并,而又不想(不需要)進行再編碼的操作的時候。這種方式對源視頻同樣有同格式同性質的要求。其詳細語法參見?這里?。典型的命令示例如下:
ffmpeg -f concat -i Cam01.txt -c copy Cam01.mp4其中,Cam01.txt 為包含了輸入文件的描述文件。
??使用concat濾鏡(filter)進行視頻文件的合并:
當需要進行任意程度的重新編解碼時,官方推薦使用的方法即是用concat濾鏡來進行視頻文件的合并處理。詳細說明參見?這里?。典型命令示例如下:
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \<span class="string" style="color: rgb(221, 17, 68);">'[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]concat=n=3:v=1:a=2 [v] [a1] [a2]'</span> \-<span class="keyword" style="font-weight: bold;">map</span> <span class="string" style="color: rgb(221, 17, 68);">'[v]'</span> -<span class="keyword" style="font-weight: bold;">map</span> <span class="string" style="color: rgb(221, 17, 68);">'[a1]'</span> -<span class="keyword" style="font-weight: bold;">map</span> <span class="string" style="color: rgb(221, 17, 68);">'[a2]'</span> output.mkv這段命令目的是將三段雙語格式的視頻合并至最終的一段視頻(output.mkv)。參數n=3說明待合成的視頻有三段,v=1說明視頻流為一,a=2說明音頻流為二。 -map參數的詳細說明可以從Filtergraph文檔中找到。
FFMpeg無損合并視頻的多種方法 http://blog.csdn.net/doublefi123/article/details/47276739
眾所周知,從某些視頻網站下載的視頻是分段的。比如新浪視頻每隔6分鐘分段,俗稱“6分鐘詛咒”。 現在的任務是將這些視頻片段合并起來,并且盡量無損。
方法一:FFmpeg concat 協議
對于 MPEG 格式的視頻,可以直接連接: ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg 對于非 MPEG 格式容器,但是是 MPEG 編碼器(H.264、DivX、XviD、MPEG4、MPEG2、AAC、MP2、MP3 等),可以包裝進 TS 格式的容器再合并。在新浪視頻,有很多視頻使用 H.264 編碼器,可以采用這個方法 ffmpeg -i input1.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts ffmpeg -i input2.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts ffmpeg -i input3.flv -c copy -bsf:v h264_mp4toannexb -f mpegts input3.ts ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4 保存 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?中轉義。方法三:Mencoder 連接文件并重建索引
這種方法只對很少的視頻格式生效。幸運的是,新浪視頻使用的 FLV 格式是可以這樣連接的。對于沒有使用 MPEG 編碼器的視頻(如 FLV1 編碼器),可以嘗試這種方法,或許能夠成功。 mencoder -forceidx -of lavf -oac copy -ovc copy -o output.flv input1.flv input2.flv input3.flv方法四:使用 FFmpeg concat 過濾器重新編碼(有損)
語法有點復雜,但是其實不難。這個方法可以合并不同編碼器的視頻片段,也可以作為其他方法失效的后備措施。 ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -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.mkv 如你所見,上面的命令合并了三種不同格式的文件,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 中需要用引號,防止通配符擴展。提示
總結
以上是生活随笔為你收集整理的使用ffmpeg合并视频文件的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音视频同步(播放)原理
- 下一篇: EasyRTMP CPU占用问题调优(一