使用 FFmpeg 连接 mp4 文件的3 种方式

您可以使用 FFmpeg 非常轻松地连接 mp4 文件!有很多方法可以做到这一点,包括变体,例如 (1) 仅连接音频 (2) 仅连接视频 (3) 连接目录中的所有文件 (4) 连接不具有相同高度、宽度等的文件. 以及我们今天将在本 FFmpeg 教程中探讨的更多用例。

使用 FFmpeg 连接 mp4 文件

让我们从最简单的用例开始,即使用 FFmpeg 连接两个 mp4 文件。假设您有两个文件file1.mp4file2.mp4.

如果它们的属性匹配,您可以使用concat多路分离器(文档)轻松连接这些文件。也就是说,它们具有相同的高度、宽度、像素格式、编解码器等。

使用此命令有两个步骤。首先,您需要创建一个 txt 文件,其中包含要连接的所有单个文件的名称和路径。然后,您需要将此列表作为命令行参数提供给 FFmpeg。

让我们先创建列表。这是一个例子,让我们调用列表fileList.txt。在此示例中,这两个文件都在home目录中。每行以关键字开头,file并包含单引号内的文件路径。

$ cat fileList.txt
file '/home/file1.mp4'
file '/home/file1.mp4'

现在,您可以使用以下 FFmpeg 命令连接它们

./ffmpeg -f concat -safe 0 -i fileList.txt -c copy mergedVideo.mp4

在这里,您正在使用该concat命令读取您创建的视频文件列表 ( fileList.txt) 并将单个文件按该顺序复制到名为mergedVideo.mp4. 请记住,您没有在此命令行中重新编码,因为您正在使用该copy命令。

连接目录中的所有文件

这是一个常见问题,与 FFmpeg 的实际使用相比,它与 shell 脚本的关系更多。您在这里需要做的第一步是找到mp4/avi/wav目录中的所有文件并将它们添加到一个文件中。然后您可以轻松地将它们连接起来,如上所示。

for f in *.mp4 ; do echo file \'$f\' >> fileList.txt;

我在我的视频数据库文件夹中运行了这个命令,这是输出——看起来不错吧?

file 'brooklynsfinest_clip_1080p.mp4'
file 'parkjoy_1080p50_crf1.mp4'
file 'riverbed_1080p25_crf1.mp4'
file 'simpsons_1080p2398_clip.mp4'
file 'simpsons_trailer.mp4'
file 'touchdown_pass_1080p.mp4'
file 'touchdown_pass_1080p_2997fps.mp4'

然后,您可以使用我们之前学到的命令将它们连接起来concat,如下所示。

./ffmpeg -f concat -safe 0 -i fileList.txt -c copy mergedVideo.mp4

连接不同编解码器、分辨率的 mp4 文件

如果您的文件有不同的视频编解码器、像素格式或高度和宽度,那么您需要在连接文件之前重新编码它们。有两种方法可以解决这个问题——

  1. 在加入文件之前重新编码文件。这是一种简单的技术,您可以将所有文件重新编码为所需的格式,然后使用concat命令将它们连接在一起。如果我有大量视频并且我想在将它们组合在一起之前精确控制它们的质量,我会发现这很有用。
  2. concat视频过滤器——这是第二个选项,您最终会重新编码您的内容,并且您还保留了在连接视频之前过滤视频的选项。现在让我们详细了解一下这个选项。

这是一个开始的示例命令行 –

ffmpeg -i file1.mp4 -i file2.mp4 -i file3.mp4 \
       -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] 
                        concat=n=3:v=1:a=1 [vv] [aa]" \
       -map "[vv]" -map "[aa]" mergedVideo.mp4

让我们分解这个命令行,好吗?

首先,我们将输入文件的名称提供给 FFmpeg

-i file1.mp4 -i file2.mp4 -i file3.mp4

接下来,我们使用filter_complexfiltergraph 参数来指示 FFmpeg 从哪里获取音频和视频。[0:v][0:a]意味着 FFmpeg 需要从0th视频 ( file1.mp4) 中提取视频和音频。然后,您告诉 FFmpegconcat三个文件 ( n=3)。这v=1:a=1意味着音频有一个流,视频有一个流。

最后,[vv] [aa]是我们为输出视频和音频选择的名称。

-filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [vv] [aa]"

最后一步是将这些音频和视频输出映射到最终的视频容器。这是按如下方式完成的——

-map "[vv]" -map "[aa]" mergedVideo.mp4

注意:在这个阶段,你已经合并了视频和音频,[vv] [aa]你可以将它们写到最终容器中,或者在另一个过滤器中使用它们来进一步处理它们!

使用中间文件格式连接 mp4 文件

某些容器格式如mp4 不能直接使用Linux 内核的cat命令或FFmpeg 的concat命令进行拼接。一个选项是将您的文件转换为中间文件格式,然后轻松连接它们。一种常见的中间文件格式是ts(传输流)。

mp4这是将文件转换为的单行代码ts

ffmpeg -i file1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts fileIntermediate1.ts

完成转换后,您可以使用 Linux 终端或使用FFmpeg 中cat的命令将它们简单地组合在一起。concat两者都应该工作。

cat fileIntermediate1.ts fileIntermediate2.ts > output.ts

或者

ffmpeg -i "concat:fileIntermediate1.ts|fileIntermediate2.ts" -c copy -bsf:a aac_adtstoasc mergedVideo.mp4

结论

在本教程中,我们看到了使用 FFmpeg 连接视频文件的三种不同方式。我希望这对每个人都有用。如果您有任何问题需要帮助,请在下面的评论中告诉我们,我们会帮助您。

作者简介:Krishna Rao Vijayanagar 博士,OTTVerse 的创始人。在伊利诺伊理工学院获得视频压缩博士学位,多年来我一直从事视频压缩(AVC、HEVC、MultiView Plus Depth)、ABR 流媒体和视频分析(QoE、内容和受众以及广告)方面的工作。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论