2013-08-31 72 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'输出的协议列表中) –