主要答案没有对我起作用,因为它给了我下面在“故障排除”部分中描述的错误,所以这是我的答案。
如果你想知道如何将多个.mov
或.MOV
文件合并成一个文件,请参考我在这里的其他答案:Super User: 合并MOV视频文件。我还有一个find
命令,可以快速将所有感兴趣的文件收集到files.txt
或inputs.txt
中,而不必手动操作。
如何使用ffmpeg
连接或合并多个mp4视频文件
快速摘要
创建一个包含要合并的所有文件路径列表的inputs.txt
文件(参见下面的示例)。然后,像这样将所有上述视频合并成一个文件:
time ffmpeg -f concat -safe 0 -i inputs.txt -c:v copy -c:a aac output.mp4
time ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mkv
在Ubuntu 20.04上进行了测试,将我的多个Wyze安全摄像头视频合并为一个视频。(我将摄像头的微型SD卡直接插入了我的电脑)。
创建一个名为`inputs.txt`的文件,其中包含您想要连接的所有文件的列表。例如:
```
file 'path/to/file1.mp4'
file 'path/to/file2.mp4'
file 'path/to/file3.mp4'
```
在我的情况下,我将从2022年11月13日18:31(下午6:31)到2022年11月13日19:39(下午7:39)的69分钟视频合并在一起。在Wyze安全摄像机路径中,这意味着从`record/20221113/18/31.mp4`到`record/20221113/19/39.mp4`,包括这两个文件。所以,这是我的完整的`inputs.txt`文件。请注意,您可以使用Sublime Text或MS VSCode的多光标编辑模式快速轻松地编辑或创建此类文件,以同时编辑多行和位置。在这种情况下,我使用的是Sublime Text。
将所有以上视频合并为一个视频:
```
# 选项1(首选):合并为一个具有AAC音频编码和原始视频编码的单个mp4视频
time ffmpeg -f concat -safe 0 -i inputs.txt -c:v copy -c:a aac output.mp4
# 选项2:合并为一个具有原始音频和视频编码的单个.mkv视频
time ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mkv
```
在我的情况下,原始的69个文件占用了
411.1 MB的空间。以下是上述两个命令的结果:
output.mp4
生成所需时间11秒,文件大小为380.3 MB。AAC编码的音频似乎稍微小一些。
output.mkv
生成所需时间8秒,文件大小为410.7 MB。
故障排除/可能的错误
如果你运行
ffmpeg -f concat -i inputs.txt -c copy output.mp4
并且出现以下错误:
[concat @ 0x563ca0173700] Unsafe file name '/media/gabriel/3339-3730/record/20221113/18/31.mp4'
inputs.txt: Operation not permitted
...这是因为你忘记使用
-safe 0
了。
参考:
- https://nono.ma/says/concat-unsafe-file-name-operation-not-permitted
- ffmpeg concat: "Unsafe file name"
如果你运行
ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mp4
并且出现以下错误:
[mp4 @ 0x55ced96f2100] Could not find tag for codec pcm_alaw in stream #1, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
...这是因为"
ffmpeg
不支持在MP4容器中使用PCM (pcm_alaw, pcm_s16le等)。" 请参考:
codec not currently supported in container和
here。所以,改为运行
time ffmpeg -f concat -safe 0 -i inputs.txt -c:v copy -c:a aac output.mp4
来重新编码音频为AAC格式。或者,运行
time ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mkv
将输出写入.mkv容器而不是.mp4容器。