如何使用avconv合并视频?

38

我在文件夹中有几个块。

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。


我已经在这里提交了一个关于webm的相关错误:https://bugzilla.libav.org/show_bug.cgi?id=775 - v010dya
由于您从Dropbox中删除了avconv.txt文件,因此存在链接失效的问题。我将从问题中将其删除。 - v010dya
http://superuser.com/questions/521113/join-mp4-files-in-linux - Ciro Santilli OurBigBook.com
我在Windows上使用了avconv -i "concat:`ls *.mp4 | tr '\r\n' '|'" -c copy "combined.mp4"。对于Linux,我认为你只需要使用\n而不是\r\n。 - alirobe
10个回答

34

mp4 文件不能像“被接受的”答案所建议的那样简单地连接起来。

如果您只运行该命令,您最终将只得到 file1.mp4 的内容,而不是完整的 output.mp4

话虽如此,如果您正确地将原始文件分割成 MPEG 流,则可以实现原始问题中要求的操作。

以下命令将把 input.mp4 分成 3 个 60 秒的片段,存储在 file[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' is not a suitable output format。有什么建议吗? - Mr Lister
1
你有哪个版本的avconv? - Aaron
我在使用 avconv 版本 12 时遇到了同样的问题。版本 11 也不起作用。 - omnibrain

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

我不知道它是否适用于任何容器类型(对我来说,它适用于 AVI )。


10
对我来说没有用……我不得不使用mencoder处理它……使用以下命令:mencoder -oac pcm -ovc copy -o 合并后的文件名.mp4 ls *.mp4 - Pipo
6
无法以此方式串联MP4容器。 - Dustin Kirkland
mp4和matroska不能拼接。您需要先重新编码为可拼接或随机可寻址的容器,例如MPEG-TS或NUT。 - Christian Hujer
3
接受的答案 对我没有用。相反,我使用了 MP4Box 命令(来自 gpac 包),如下所示:MP4Box video1.mp4 -cat video2.mp4 -cat video3.mp4 [...] -out video-full.mp4 - code_dredd
1
不行,不起作用。最终结果是视频的长度与第一个视频一样长,可观看的内容正好是第一个视频的内容。其他视频似乎被忽略了。 - filmil
正如@test所述,使用AVI封装器这种技术对我很有效。 - Digger

10

对于mp4,我找到的唯一可行的解决方案是使用gpac软件包中的MP4Box。

#!/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 -cat file1.mp4 -cat file2.mp4 -new mergedFile.mp4

使用mencoder和avconv时,我无法使其正常工作 :-(


我正在使用Debian Jessie,这是我唯一能运行的答案(主要是由于缺少软件包)。然而结果很奇怪,实际流比VLC显示的短,当寻找时它只是重新开始播放。 - Attila Lendvai
一个更短的命令行,可以接收当前目录中的所有mp4文件:MP4Box $(printf -- "-cat %s " *.mp4) -new mergedFile.mp4 - filmil

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 demuxer(附加信息)或concat filter代替,但是avconv缺乏FFmpeg中可用的这些特性" - @LordNeckbeard
    SEE  https://trac.ffmpeg.org/wiki/Concatenate

如果您使用支持命名管道的系统,您可以使用这些管道来避免创建中间文件。这会将stderr(ffmpeg发送所有已写入数据的地方)发送到/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

显示了很多错误(在最后一步),但是唯一的答案确实为我生成了一个合并文件,所以+1! - Mark
这对我来说几乎可以工作,但是会有质量损失...(图像被像素化了)。有什么办法解决这个问题吗? - S. Caruso

2

这个对我有效:


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

将所有文件合并成一个mp4文件,无需重新编码。


1
我找到这个页面的唯一原因是因为这个解决方案只输出“concat :: Protocol not found”(即使它在“avconv-protocol”输出的协议列表中)。 - Jeremy List
在Mac 10.13.6上使用Homebrew安装的avconv 12.3中,我也在输入列表中遇到了上述错误。 - Pysis

0

在尝试了所有类似的答案后,我仍然没有得到解决错误信息的答案:

~ avconv -i 'concat:' -c copy test.mp4
avconv version 12.3, Copyright (c) 2000-2018 the Libav developers
  built on Jan 22 2019 21:47:11 with Apple LLVM version 10.0.0 (clang-1000.11.45.5)
concat:: Protocol not found

我查看了一些谷歌搜索结果,进入了缺陷跟踪器,并找到了这些:

看起来不仅在某个时间点被禁用了,而且在版本12中被删除了,但我的Mac 10.13.6上的Homebrew版本12.3仍然在输入协议中列出了“concat”,我也在文档中看到了它,因此有一个未解决的错误报告。

我使用了这个命令,运气还不错:

cat *.VOB | avconv -i - -c copy test.mp4

0
我正在使用ffmpeg命令来做这件事。下面是一个例子:
ffmpeg -i concat:/dev/null|file1.ts|file2.ts -c copy -bsf:a aac_adtstoasc -y output.mp4

请查看此Github项目,了解分布式并行视频转码


0

这个方法只适用于连接原始的 *.avi 文件,我想。但是由于很多人想要合并 avi 文件最终会看到这个问题,我还是在这里发布我的答案:

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

再说一遍:仅适用于未压缩的 *.avi 文件。

0

我使用 avidemux(GTK 工具)完成了这个任务。它可作为一个软件包在大多数Linux系统、Windows和Mac上使用。

我只需打开第一个文件,然后按顺序添加下一个文件。最后,我使用音频和视频复制并选择 mp4 格式保存合并的视频。

效果非常好!


0
我找到了一个名为Avdshare Video Converter 7的工具,它可以成功地将我的视频拼接在一起。它甚至可以将它们转码成我想要的任何格式。
我尝试了这个页面上的每一个解决方案...所有的解决方案都给了我同样的错误,如果你正在阅读我的答案,那么你可能也遇到了这些问题。"协议未找到"让你心烦吗?那么也许这个程序也适合你。
我在Windows上运行它。
在该程序中拼接两个视频的步骤如下:
1. 将您的视频拖放到程序中 2. 点击合并 3. 选择一个“保存配置文件”,其中包含您想要调整的每个参数 4. 点击保存按钮

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接