You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:39:02