我在文件夹中有几个块。
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 :(得分:35)
mp4
文件无法简单连接,正如“已接受”的答案所暗示的那样。
如果您运行该功能,那么您最终只会output.mp4
只拥有file1.mp4
的内容。
那就是说,只要你将原始文件正确地分成mpeg流,你原本可以在原始问题中做些什么。
以下命令会将input.mp4
拆分为3x 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 :(得分:19)
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4
我不知道是否可以使用任何容器的类型(使用AVI
为我工作)。
答案 2 :(得分: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我可以使它工作: - (
答案 3 :(得分: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添加了函数...引用:
&#34;以上avconv步骤执行了不必要的额外有损编码步骤,这些步骤很慢并且减少了 输出的质量。我建议使用concat demuxer(附加信息) 或者是concat过滤器,但是avconv缺少来自FFmpeg&#34;的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
答案 4 :(得分:2)
这个适用于我:
avconv -i "concat:001.mp4|002.mp4|003.mp4" -c copy full.mp4
只需将所有文件串联到一个mp4中,无需重新编码。
答案 5 :(得分:0)
我想这个方法只能用于汇总 raw * .avi 文件。但是,由于许多愿意加入avi文件的人最终会看到这个问题,我会在这里发布我的答案:
cat *.avi > out_tmp.avi
avconv -i out_tmp.avi -c copy output.avi
再一次:仅适用于未压缩* .avi 文件。
答案 6 :(得分:0)
我用 avidemux (gtk工具)做到了这一点。它可以作为大多数linux下的软件包提供,也适用于Windows和Mac。 我只是打开了第一个文件。然后我按顺序添加了下一个。 最后,我使用音频和视频副本以及格式mp4保存了连接的视频。
效果很好!
答案 7 :(得分:0)
我正在使用ffmpeg
命令执行此操作。这是一个例子:
ffmpeg -i concat:/dev/null|file1.ts|file2.ts -c copy -bsf:a aac_adtstoasc -y output.mp4
的这个github项目
答案 8 :(得分:0)
我找到了一个名为 Avdshare Video Converter 7 的工具,该工具可以成功连接我的视频。它甚至将它们转码成我想要的任何格式。
我在此页面上尝试了每个解决方案... 所有都给了我与您在阅读答案时可能遇到的相同错误。 “找不到协议”会让您不高兴吗?他们也许这也是适合您的程序。
我正在Windows上运行它。
在程序中串联两个视频的步骤是:
将视频拖放到程序中
点击合并
选择一个“保存配置文件”,它指定了您可能曾经使用过的每个参数 想调整
点击“保存”按钮
答案 9 :(得分: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
我浏览了一些Google结果,进入了错误跟踪器,并找到了以下结果:
似乎它不仅在某个时候被禁用,而且在版本12中被删除,但是我在Homebrew的Mac 10.13.6上的内部版本12.3仍然在输入协议中列出了“ concat”,我也在文档中看到了它,因此有1个未完成的错误报告。
我使用此命令有些运气:
cat *.VOB | avconv -i - -c copy test.mp4