2013-08-31 127 views
35

我在文件夾中有幾個塊。如何通過avconv合併視頻?

0001.mp4 
0002.mp4 
0003.mp4 
... 
0112.mp4 

我想將它們合併到full.mp4

我試着使用:

avconv -f concat -i <(printf "file '%s'\n" /root/chunk/*.mp4) -y \ 
-c copy /root/test/full.mp4 

未知輸入格式: 'CONCAT'

avconv -f concat -i <(printf "%s|" /root/chunk/*.mp4) -y \ 
-c copy /root/test/full.mp4 

未知的輸入格式:'concat'

avconv -i concat:`ls -ltr /root/chunk/*.mp4 | awk 'BEGIN {ORS="|"} { print $9 }'` \ 
-c:v copy -c:a copy /root/test/full.mp4 

在上一版中,只有一個輸入文件被捕獲輸出。

如何將文件夾中的所有塊合併爲完整視頻?

我不想使用ffmpeg或其他。僅限Avconv。

+0

我已經提交了相關的錯誤,當談到這裏的WebM:https://bugzilla.libav.org/show_bug.cgi ?id = 775 – v010dya

+0

有一個鏈接腐爛的問題,因爲你已經從你的Dropbox中刪除了avconv.txt文件。我要從問題中刪除它。 – v010dya

+0

http://superuser.com/questions/521113/join-mp4-files-in-linux –

回答

20
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4 

我不知道是否適用於任何容器類型(使用AVI爲我工作)。

+8

Didnt爲我工作...必須使用mencoder ... mencoder -oac pcm -ovc copy -o merged_file.mp4'ls *。 mp4' –

+0

不適用於mp3和avconv 0.8.10 – Andy

+5

mp4容器不能以這種方式連接。 –

34

mp4文件不能簡單連接,因爲「接受」的答案建議。

如果你運行這個,那麼你只能得到output.mp4只有file1.mp4的內容。

也就是說,只要將原始文件正確拆分爲mpeg流,就可以在原始問題中完成所要做的事情。

下面的命令將拆分成input.mp4 3倍60秒段,在文件[1-3] .TS:

avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \ 
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file1.ts 
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \ 
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file2.ts 
avconv -ss 0 -i input.mp4 -t 60 -vcodec libx264 -acodec aac \ 
    -bsf:v h264_mp4toannexb -f mpegts -strict experimental -y file3.ts 

您可以然後把他們重新走到一起就像對方回答提示:

avconv -i concat:"file1.ts|file2.ts|file3.ts" -c copy \ 
    -bsf:a aac_adtstoasc -y full.mp4 

我用這個過程創建一個可擴展的,平行的代碼轉換器如描述:

+1

此解決方案不適合我。如果我在命令行的任何地方使用'concat'這個詞,我總是會遇到'Unknown input format:'concat''或'Requested output format'concat:test.mp3'不是合適的輸出格式'的錯誤。有什麼建議麼? –

+1

你有什麼版本的avconv? – Aaron

+0

我遇到了與avconv版本12相同的問題。版本11也不能正常工作 – omnibrain

0

此方法適用於只concating 生* .AVI文件做的,我想。但是,由於很多人願意加入AVI文件最終會觀察這個問題,我會在這裏發佈反正我的回答:

cat *.avi > out_tmp.avi 
avconv -i out_tmp.avi -c copy output.avi 

再來一次:適用於未壓縮的AVI *僅文件。

6

這個作品

avconv -i 1.mp4 1.mpeg 
avconv -i 2.mp4 2.mpeg 
avconv -i 3.mp4 3.mpeg 

cat 1.mpeg 2.mpeg 3.mpeg | avconv -f mpeg -i - -vcodec mpeg4 -strict experimental output.mp4 

上述工作,如果你只有avconv - 但是ffmpeg的添加了功能...到報價:

「以上avconv步驟確實是緩慢和降低 的輸出的質量不必要的附加的有損編碼步驟我建議使用的concat分路器(附加信息) 或CONCAT濾波器代替,但avconv缺乏那些。從FFmpeg的FFmpeg的」可用的功能 - @LordNeckbeard

SEE https://trac.ffmpeg.org/wiki/Concatenate 

如果您使用的是一個支持命名管道系統,你可以使用這些來避免產生中間文件 - 這將標準錯誤(其中的ffmpeg會將所有寫入的數據to)到/ dev/null,以避免混淆命令行:

mkfifo temp1 temp2 
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null & \ 
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null & \ 
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4 
+0

顯示了很多錯誤(在最後一步),但唯一的答案確實導致了我的合併文件,所以+1! – Mark

+1

只有這個工作對我來說 –

10

針對MP4唯一的工作解決我發現了與GPAC包

#!/bin/bash 
filesList="" 
for file in $(ls *.mp4|sort -n);do 
    filesList="$filesList -cat $file" 
done 
MP4Box $filesList -new merged_files_$(date +%Y%m%d_%H%M%S).mp4 

或命令MP4Box是

MP4Box -cat file1.mp4 -cat file2.mp4 -new mergedFile.mp4 

用於MEncoder並且avconv我could'nt讓它工作:-(

+0

我在debian jessie上,這是我可以運行的唯一答案(主要是由於缺少包)。結果雖然很奇怪,但實際的流比VLC顯示的要短,它只是重新開始播放。 –

+0

這是一個了不起的工具,謝謝你提到它! –

+0

一個較短的命令行,將採取當前目錄中的所有mp4文件是:'MP4Box $(printf - 「 - cat%s」* .mp4)-new mergedFile.mp4' – filmil

0

我做到了avidemux(gtk工具)。它可以作爲大多數Linux下的軟件包提供,也可用於Windows和Mac。 我只是打開第一個文件。然後我按順序添加了下一個。 最後,我使用音頻和視頻副本以及mp4格式保存了連接的視頻。

它工作得很好!

2

這一次爲我的作品:

avconv -i "concat:001.mp4|002.mp4|003.mp4" -c copy full.mp4 

只是concats所有文件到一個MP4不重新編碼他們。

+0

我發現這個頁面的唯一原因是因爲這個解決方案只輸出'concat :: Protocol not found'(即使它在'avconv -protocol'輸出的協議列表中) –