如何合并不同长度但遵循音频文件长度的视频(带音频)和音频文件

如何合并不同长度但遵循音频文件长度的视频(带音频)和音频文件

我正在尝试将 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 覆盖目标文件,而无需提示。

就是这样。

我绝不是一个专家,我确​​信这里有些细微差别我可能没有注意到,但这是我能够弄清楚的,它满足了我的需求。

相关内容