我想使用 ffmpeg 将两个 mp4 视频合并为一个 mp4 视频。
到目前为止我尝试的是:
ffmpeg -i input1.mp4 -i input2.mp4 output.mp4
但是,每次我获取带有第一个输入的视频编解码器而不是另一个输入的视频时。我怎样才能将它们结合起来?
如之前的答案所示,您需要首先转换为中间格式。如果mp4包含h264比特流,您可以使用:
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -c copy output.mp4
您可以在此处找到更详细的答案。
请阅读 FFMPEG FAQ,了解有关加入文件的信息。
不幸的是,由于您使用的是 MP4 文件,简单的串联对您不起作用,因为 MP4 格式包含一个“标头”(尽管它不一定位于文件的开头)部分,该部分描述并包含媒体数据的偏移量。您需要将两个文件转码为可以串联的格式,然后从该格式生成 MP4 文件(这将生成适当的标头部分)。
您无法连接 .mp4 文件,但可以连接 .mpg 文件。首先尝试使用 ffmpeg 将两个视频转换为 .mpg。然后,对两个 .mpg 文件运行简单的 linux cat 命令以创建组合的 .mpg 文件。之后,使用 ffmpeg 将串联的 .mpg 文件转换为 .mp4。这是一种迂回的方法,但它确实有效。您可以使用“命名管道”来减少命令数量,但结果是相同的。
您可以使用
ffmpeg
来完成此操作,但还有一个小工具,称为 MP4Box
(GPAC 的一部分),可以连接多个 MP4 文件。
在你的情况下,语法是
MP4Box -cat input1.mp4 -cat input2.mp4 output.mp4
如果所有输入都具有相同的属性、格式和视频/音频流数量,那么您可以使用concat demuxer。这可以让您无需重新编码即可连接,因此速度很快并保持质量。
使
input.txt
包含以下内容:
file 'input1.mp4'
file 'input2.mp4'
连接
ffmpeg -f concat -i input.txt -c copy output.mp4
如果出现错误
Unsafe file name
添加 -safe 0
连接分路器输入选项(在 -i
之前)。
如果您的输入不同或任意,则:
使用concat过滤器。请参阅如何在 ffmpeg 中连接具有不同属性的视频? 需要重新编码,但当您的输入是随机、混合、不可预测或任意时,这是更好的选择。
另请参阅 FFmpeg Wiki:连接。
这可能不是最好的解决方案,因为它会创建临时文件。但我想为人们提供一个简单的答案作为替代方案:
#!/usr/bin/env bash
# Synopsis: Combine any input videos to a mp4 file.
# Usage: ffmpeg-combine-videos input_video1 input input_video2 ...
n=0
rm -f __input*
> __input.list
for i in "$@";do
I=__input${n}.ts
ffmpeg -i "$i" -c:v h264 -b:v ${VIDEO_BITRATE:-400k} -c:a libmp3lame -f mpegts "$I"
echo "file $I" >> __input.list
n=$((n+1))
done
ffmpeg -f concat -safe 0 -i __input.list -c copy combined.mp4
rm -f __input*