You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg使用apad滤镜补全音频时长后音视频时长仍存在微小差异的问题咨询

FFmpeg使用apad滤镜补全音频时长后音视频时长仍存在微小差异的问题咨询

你好,我来帮你分析这个问题并给出可行的解决方案:

问题原因分析

你遇到的微小时长差异,主要是因为音视频的时间基准和帧结构不同导致的:

  • 视频的时长是基于帧率和总帧数计算的(你的视频是25fps,3.64秒正好对应91帧,时长是精准的整数帧时长);
  • 音频的apad滤镜是按音频帧的最小单位来补全静音的,而音频帧的长度由采样率、编码格式决定(比如你的MP3音频采样率44100Hz,每帧时长是固定的),无法做到和视频时长完全对齐到小数点后六位,所以补全后的音频时长会和视频有微小差距;
  • 另外你命令里的-shortest参数其实起到了反作用:它会让FFmpeg以输入流中最短的时长作为输出时长,但因为视频流是直接copy的,最终容器里还是保留了原视频的时长,而音频是补全后的接近时长,导致两者不一致。

解决方案

你可以通过以下几种方式让音视频时长完全一致:

方法1:明确指定输出时长为视频的时长

先获取视频的精确时长,然后用-t参数强制输出时长和视频一致,FFmpeg会自动让音频补全到该时长:

# 先获取视频的精确时长
VIDEO_DUR=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 video.mp4)
# 执行FFmpeg命令
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]apad" -map 0:v -map 1:a -c:v copy -t "$VIDEO_DUR" output.mp4

方法2:在apad滤镜中直接指定补全到视频时长

把视频的时长直接传入apadpad_dur参数,让滤镜精确补全到目标时长:

ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]apad=pad_dur=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 video.mp4)[aout]" -map 0:v -map "[aout]" -c:v copy output.mp4

方法3:使用音频滤镜强制对齐时长

如果上面的方法还有微小差异,可以结合atrimapad,先把音频修剪到视频时长,不足的部分补静音:

ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]atrim=duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 video.mp4),apad[aout]" -map 0:v -map "[aout]" -c:v copy output.mp4

验证结果

执行完命令后,你可以再用ffprobe检查输出文件的音视频时长:

ffprobe -v error -show_entries stream=codec_type,duration -sexagesimal output.mp4

此时音视频的时长应该会完全一致。

备注:内容来源于stack exchange,提问作者Richard

火山引擎 最新活动