ffmpeg 添加音频但保持视频长度相同(不是最短)

ffmpeg 添加音频但保持视频长度相同(不是最短)

我正在使用 ffmpeg 将音频添加到视频文件,如下所示

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

但是,如果输出视频文件比视频长,则这会将输出视频文件的长度延长到音频文件的长度。如果音频文件比视频短,则使用 -shortest 会缩短视频文件的长度。那么是否有一个标志可以告诉 ffmpeg 将输出视频的长度缩短到输入视频的长度?

答案1

  • 如果视频长度短于音频长度,-shortest这就是您想要的。
  • 如果视频长度比音频长度长,则根本不需要任何标志。

没有标志可以自动做出此决定。

编辑

受到@deadcode 回答的启发,我需要澄清的是,“没有标志可以自动化”当然是不正确的,如果你是愿意重新编码apad:在这种情况下,按照@deadcode 的建议进行。

然而,如果您想避免重新编码(即-c:v copy),答案仍然成立。

有一个使用ffconcat解复用器的解决方案,但是需要做一些工作:

  • 创建包含静音的文件格式完全相同作为您的音频文件(“silence.wav”)
  • 创建一个连接文件“audio.ffconcat”(包含尽可能多的静音行以确保您的音频足够长):

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • 跑步ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

这将合成apad没有过滤器图的过滤器,从而无需重新编码即可实现多路复用。

答案2

我相信,如果视频较长,您可以使用 -filter_complex 选项和 apad 过滤器选项在音频末尾添加静音,从而实现预期目标。您的命令将是:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

假设您想要的音频位于 audiofile.wav 的第一个流中,[A:B] 语法表示从第 A 个输入中获取第 B 个流(均从 0 开始,因此 [1:0] 是来自第二个输入的第一个流,或上面的 audiofile.wav)。

详情请见: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68

答案3

如果你知道视频文件的长度,你可以使用

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

其中 43 是视频文件的长度(以秒为单位)。

答案4

ffmpeg仅供参考,现在,通过 CMD的当前/最新的默认行为:

c:\sbin\ffmpeg.exe -i "D:\video.m4s" -i "\audio.m4s" -c:v copy -c:a copy "D:\combined.mp4" 

正在填充较短的一个。

  • 如果 (audio.length < video.length),则它会用静音填充音频,以便audio.length === video.length
  • 如果 (audio.length > video.length),则用该视频的最后一帧填充视频,以便audio.length === video.length

相关内容