我正在使用 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