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

ste*_*ter 16 audio video ffmpeg

我正在使用 ffmpeg 将音频添加到视频文件中

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*eck 15

  • 如果视频长度比音频长度短,-shortest就是你想要的。
  • 如果视频长度比音频长度长,则根本没有您想要的标志。

没有标志可以自动执行此决定。

编辑

受到@deadcode 回答的启发,我需要明确指出,“没有要自动化的标志”当然不是真的,如果您愿意重新编码:在这种情况下,请apad按照@deadcode 的建议进行操作。

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

有一个使用ffconcatdemuxer的解决方法,但它需要一些工作:

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

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
Run Code Online (Sandbox Code Playgroud)
  • ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

这将在apad没有过滤器图的情况下合成过滤器,从而允许多路复用而无需重新编码。


dea*_*ode 13

我相信您可以通过使用 -filter_complex 选项和 apad 过滤器选项来实现您想要的目标,如果视频更长,则在最后用静音填充音频。你的命令是:

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

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

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


小智 9

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

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4
Run Code Online (Sandbox Code Playgroud)

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