如何将AAC加入FFmpeg filter_complex/split 让音频同yadif一样仅编码一次
解决方案
核心原理
你原命令重复编码音频的原因是:给两个输出分别单独指定了-c:a aac编码参数,FFmpeg会为每个输出单独执行一次AAC编码。要实现音频仅编码一次,只需让FFmpeg对输入音频完成一次编码后,直接把编码好的音频流复制到两个输出文件即可,无需重复编码。
优化后的命令
ffmpeg -y -hwaccel cuvid -i test.mxf \ -filter_complex "[0:v]yadif=1,split=2[out1][out2]" \ -c:a aac -b:a 192k \ # 第一个输出:1080P -map "[out1]" -s 1920:1080 -c:v h264_nvenc -force_key_frames "expr:gte(t,n_forced*10)" -pix_fmt yuv420p -preset slow -rc vbr_hq -b:v 4.5M \ -map 0:a -c:a copy test2.mp4 \ # 第二个输出:432P -map "[out2]" -s 768:432 -c:v h264_nvenc -force_key_frames "expr:gte(t,n_forced*10)" -pix_fmt yuv420p -preset slow -rc vbr_hq -b:v 1.5M \ -map 0:a -c:a copy test3.mp4
改动说明
- 把原本分散在两个输出里的音频编码参数
-c:a aac -b:a 192k移到所有输出参数之前,作为全局音频编码配置,FFmpeg仅会对输入音频执行一次AAC编码 - 两个输出的音频配置都改为
-map 0:a -c:a copy,直接复用已经编码完成的AAC流,不需要二次编码 - 视频处理逻辑和原命令完全一致,仍保持yadif去隔行后拆分两路分别编码的逻辑,输出效果和原命令完全相同
如果你需要对音频做滤镜处理(比如音量调整、声道重映射等),可以将音频处理逻辑加入filter_complex,示例如下:
ffmpeg -y -hwaccel cuvid -i test.mxf \ -filter_complex "[0:v]yadif=1,split=2[out1][out2];[0:a]loudnorm=I=-16,LRA=11,asplit=2[aout1][aout2]" \ -c:a aac -b:a 192k \ -map "[out1]" -s 1920:1080 -c:v h264_nvenc -force_key_frames "expr:gte(t,n_forced*10)" -pix_fmt yuv420p -preset slow -rc vbr_hq -b:v 4.5M \ -map "[aout1]" -c:a copy test2.mp4 \ -map "[out2]" -s 768:432 -c:v h264_nvenc -force_key_frames "expr:gte(t,n_forced*10)" -pix_fmt yuv420p -preset slow -rc vbr_hq -b:v 1.5M \ -map "[aout2]" -c:a copy test3.mp4
这种写法下音频滤镜也仅执行一次,和视频的yadif处理逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Christian R
相关产品推荐
相关产品推荐

