合并两个视频的ffmpeg操作

19
我想使用ffmpeg将两个mp4视频合并成一个单独的mp4视频。
到目前为止,我尝试过的是:
ffmpeg -i input1.mp4 -i input2.mp4 output.mp4

但是,每次我都只得到第一个输入的视频编解码器的视频,而不是其他的。如何将它们合并?对此有任何想法将不胜感激。


2
“video codec of first input and not the other”是什么意思?它们是不同的视频格式吗?输出中是否会获取两个视频的内容? - TheJuice
1
请提供更多细节。您希望如何将它们组合?是按顺序还是想要在一个文件中有两个并行视频流?MP4只是一个容器。实际编解码器是否相同?请为您的两个文件提供“ffprobe”的输出。 - mpenkov
1
这段程序相关的内容英文到中文的翻译如下:两个视频的格式相同,但在输出文件中我只得到了第一个视频。 - Astha
我想将这两个视频按顺序合并。 - Astha
5个回答

21

如之前的答案所示,您需要先将其转换为中间格式。如果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

您可以在这里找到更详细的答案。


这就是答案!大多数用户需要连接 .mp4 文件,但是我找不到解决方案,直到我发现了这个!非常感谢。 - Shreyesh Desai

9
请阅读FFMPEG的常见问题解答,了解如何拼接文件。
很不幸,由于您正在使用MP4文件,简单地连接这些文件无法奏效,因为MP4格式包含“头”(尽管不一定在文件开头)部分,该部分描述并包含媒体数据的偏移量。您需要将两个文件转码为可以连接的格式,然后从该格式生成一个MP4文件(这将生成适当的头部分)。

视频大小怎么办?如何在连接之前将其转换为正确的大小? - Natim

6
你可以使用ffmpeg来实现这一点,但也有一种名为MP4Box的小工具(属于GPAC),可以连接多个MP4文件。

在你的情况下,语法如下:

MP4Box -cat input1.mp4 -cat input2.mp4 output.mp4

3
你可以使用 ffmpeg 中的 concat demuxer(如果你的输入都是相同格式,等等,并且你想要进行流拷贝)或者 concat filter(如果你想要重新编码,和/或者你的输入没有相同的格式、时间基准等)。 - llogan
嘿,非常感谢。我刚刚使用mp4box测试了来自我的GoPro的多个mp4文件。我很惊讶这个工具运行得如此之好,视频无缝合并。 - daniel
@llogan为什么没有回答呢? - Furkan Gözükara
@MonsterMMORPG 添加了一个 回答. - llogan

6

你不能将 .mp4 文件连接起来,但可以将 .mpg 文件连接起来。尝试使用 ffmpeg 将两个视频都转换为 .mpg 格式。然后,在两个 .mpg 文件上运行一个简单的 Linux cat 命令以创建一个组合的 .mpg 文件。之后,使用 ffmpeg 将连接的 .mpg 文件转换为 .mp4。这是一种迂回的方法,但它能够实现目标。你可以使用“命名管道”来减少命令的数量,但结果是相同的。


5

concat demuxer: 快速且保留质量

如果所有输入都具有相同的属性、格式和视频/音频流数量,则可以使用concat demuxer。这样可以在不需要重新编码的情况下进行连接,因此速度快且保留质量。

  1. Make input.txt containing the following:

    file 'input1.mp4'
    file 'input2.mp4'
    
  2. Concatenate

    ffmpeg -f concat -i input.txt -c copy output.mp4
    

    If you get error Unsafe file name add the -safe 0 concat demuxer input option (before -i).

如果您的输入不匹配

如果您的输入是不同的或是任意的,则可能会出现以下情况:


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