我正在尝试将 mp4(包含视频和音频)与 mp3 合并以制作最终的 mp4。输入的长度可以不同,但输出应遵循 mp3/音频文件。
因此,如果 mp3 比视频短,那么视频就会被缩短。
如果 mp3 比视频长 - 则会复制 mp4 的最后一帧,直到音频结束。
我还想根据一些单独确定的因素来调整输入 mp4 中的音频音量。
我见过类似这样的帖子合并不同时长的视频和音频秘密似乎在于 -filter_complex 命令,但我还没有找到很好的资料来解释如何使用该 cl 开关。
我查看了 FFmpeg.org,但 filter_complex 分散在文档中。你必须了解大部分内容,才能将其拼凑起来。
是否有人有好的“-filter_complex for dummies”文档,或者您是否知道我应该使用什么 FFmpeg 命令来实现我的目标?
fwiw - 我确实运行了我链接的帖子中的命令,并且预料到了这个错误。
Stream specifier ':a' in filtergraph description [1:a]volume=0.15,apad[A];[0:a][A]amerge[out] matches no streams.
答案1
因此,我从来没有能够找到适合初学者的“filter_Complex”,但我把所有东西拼凑在一起。
答案如下。
合并录制的音频比视频长的地方
ffmpeg -i vid.mp4 -i rec15.webm -filter_complex "[0:a]volume=0.2,apad[A];[1:a][A]amerge[Aout]" -map 0:v -map [Aout] -y output-final.mp4
合并录制的音频比视频短的地方
ffmpeg -i vidlong.mov -i rec15.webm -filter_complex "[0:a]volume=0.2[A];[1:a][A]amerge[Aout]" -map 0:v -map [Aout] -y -shortest output-final2.mp4
至少理解第一部分
[0:a]volume=0.2,apad[A]
是一个结合音量变化和填充音频的滤波器链。
- [0:a] 是 0 输入的“a”音频流。在本例中为 vid.mp4。
- volume=0.2 是一个名为 volume 的过滤器,其第一个参数是当前音量的百分比,其中 0.2 是当前音量的 20%。
- 音量完成后,下一个操作是使用 apad(音频 pad),它将用空值填充剩余时间。
- [A] 采取这些变化的结果。
这表示一个具有输入 [0:a]、操作 - 音量变化、用空填充音频以及输出基本上为变量 [A] 的过滤器。
现在有一个单独的过滤器是 amerge,即音频合并。
[1:a][A]amerge[Aout]
- [1:a] 表示输入,其中 [1:a] 为 1 个输入,a 为其音频。在本例中为 mp3 文件。
- [A] 表示来自最后一个过滤器链的输出“变量”。amerge 需要两个输入,因此两个输入都提供。[Aout] 是此合并的输出。顺便说一句,我们可以随便叫它什么。这些变量不必是 A 或 Aout。
这就是过滤器
现在,map 基本上转换为输出文件中将显示的内容。每个 map 代表输出文件中的一个流,它们按顺序排列,因此第一个 -map 将代表流 0,依此类推。
-map 0:v
这意味着 - 第一个流是 0 输入的视频“v”。我也可以通过其编号来引用视频流。在我的情况下,它将是 0:1,但您可以使用 v 来做同样的事情。
-map [Aout]
这现在表示输出文件中的下一个流,即音频流。我们使用其最终“变量” [Aout] 引用过滤器的输出。
-y 只是告诉 FFmpeg 覆盖目标文件,而无需提示。
就是这样。
我绝不是一个专家,我确信这里有些细微差别我可能没有注意到,但这是我能够弄清楚的,它满足了我的需求。