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。

4

10 回答 10

34

mp4正如“已接受”的答案所暗示的那样,文件不能简单地连接起来。

如果你单独运行它,你最终output.mp4将只有file1.mp4.

也就是说,只要您将原始文件正确拆分为 mpeg 流,您实际上可以在原始问题中执行的操作。

以下命令将input.mp4在文件 [1-3].ts 中拆分为 3x 60 秒段:

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

我使用此过程创建了一个可扩展的并行转码器,如下所述:

于 2014-07-11T14:58:50.027 回答
20
avconv -i concat:file1.mp4\|file2.mp4 -c copy output.mp4

我不知道是否适用于任何容器类型(适用于我AVI)。

于 2013-10-11T09:15:15.777 回答
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 我无法使其工作:-(

于 2014-12-21T21:13:11.570 回答
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 过滤器,但 avconv 缺少 FFmpeg 的 ffmpeg 中可用的那些功能” – @颈须领主

    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
于 2014-10-19T15:58:28.337 回答
2

这个对我有用:

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

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

于 2015-06-07T12:24:08.330 回答
0

我想这种方法只适用于连接 原始 *.avi文件。但是由于很多愿意加入 avi 文件的人最终会看到这个问题,所以无论如何我都会在这里发布我的答案:

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

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

于 2014-10-01T22:16:41.377 回答
0

我用avidemux(gtk 工具)做到了这一点。它在大多数 linuxes 下作为一个包提供,也适用于 Windows 和 Mac。我只是打开了第一个文件。然后我按顺序添加了下一个。最后,我使用音频和视频复制和格式 mp4 保存了连接的视频。

效果很好!

于 2015-05-05T17:38:01.027 回答
0

我找到了一个名为Avdshare Video Converter 7的工具,它成功地连接了我的视频。它甚至可以将它们转码为我想要的任何格式。

我尝试了此页面上的所有解决方案...如果您正在阅读我的答案,所有这些都给了我您可能遇到的相同错误。“未找到协议”是否让您心烦意乱?他们也许这也是适合您的程序。

我在 Windows 上运行它。

在程序中连接两个视频的步骤是:

将您的视频拖放到程序中

点击合并

选择一个“保存配置文件”,指定您可能想要调整的每个参数

点击保存按钮

于 2018-06-29T16:07:12.040 回答
0

我正在使用ffmpeg命令来执行此操作。这是示例:

ffmpeg -i concat:/dev/null|file1.ts|file2.ts -c copy -bsf:a aac_adtstoasc -y output.mp4

看看这个 github 项目的分布式并行视频转码

于 2016-03-19T05:04:58.760 回答
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 中被删除,但我在 Homebrew 上的 Mac 10.13.6 上的构建 12.3 仍然在输入协议中列出了“concat”,我也在文档中看到它,因此1 个未完成的错误报告。

使用这个命令我很幸运:

cat *.VOB | avconv -i - -c copy test.mp4
于 2019-06-24T19:00:39.687 回答