音频处理
音频处理
概述
FFmpeg 提供了强大的音频处理功能,包括采样率转换、声道布局调整、音量控制、混音、均衡器、降噪等操作。这些功能主要通过音频滤镜(Audio Filter)实现。
音频基础概念
采样率
采样率(Sample Rate)表示每秒采集的样本数,单位为 Hz。
| 采样率 | 质量 | 适用场景 |
|---|
| 8000 Hz | 电话质量 | 语音通话 |
| 16000 Hz | 宽带语音 | 语音识别 |
| 22050 Hz | FM 广播 | 低质量音乐 |
| 44100 Hz | CD 质量 | 标准音乐 |
| 48000 Hz | 专业音频 | 视频制作 |
| 96000 Hz | 高保真 | 专业录音 |
| 192000 Hz | 超高保真 | 母带处理 |
# 转换采样率
ffmpeg -i input.wav -ar 44100 output_44100.wav
ffmpeg -i input.wav -ar 48000 output_48000.wav
# 查看采样率
ffprobe -v quiet -select_streams a:0 -show_entries stream=sample_rate -of csv=p=0 input.wav
位深度
位深度(Bit Depth)表示每个样本的精度。
| 位深度 | 范围 | 说明 |
|---|
| 8-bit | 0-255 | 低质量 |
| 16-bit | -32768 到 32767 | CD 质量 |
| 24-bit | -8388608 到 8388607 | 专业音频 |
| 32-bit float | -1.0 到 1.0 | 专业处理 |
# 转换位深度
ffmpeg -i input.wav -sample_fmt s16 output_16bit.wav
ffmpeg -i input.wav -sample_fmt s32 output_32bit.wav
ffmpeg -i input.wav -sample_fmt flt output_float.wav
声道布局
| 布局 | 声道数 | 说明 |
|---|
| mono | 1 | 单声道 |
| stereo | 2 | 立体声 |
| 2.1 | 3 | 立体声 + 低音 |
| 5.1 | 6 | 环绕声 |
| 7.1 | 8 | 全景声 |
# 转换声道布局
ffmpeg -i input.wav -ac 1 output_mono.wav
ffmpeg -i input.wav -ac 2 output_stereo.wav
ffmpeg -i input.wav -channel_layout 5.1 output_5.1.wav
音频采样格式转换
常用采样格式
| 格式 | 说明 | 字节/样本 |
|---|
| u8 | 无符号 8-bit 整数 | 1 |
| s16 | 有符号 16-bit 整数 | 2 |
| s32 | 有符号 32-bit 整数 | 4 |
| flt | 32-bit 浮点 | 4 |
| dbl | 64-bit 浮点 | 8 |
| u8p | 无符号 8-bit 平面 | 1 |
| s16p | 有符号 16-bit 平面 | 2 |
| s32p | 有符号 32-bit 平面 | 4 |
| fltp | 32-bit 浮点平面 | 4 |
| dblp | 64-bit 浮点平面 | 8 |
# 查看支持的采样格式
ffmpeg -sample_fmts
# 转换采样格式
ffmpeg -i input.wav -sample_fmt s16 output_s16.wav
ffmpeg -i input.wav -sample_fmt fltp output_fltp.wav
# 查看当前采样格式
ffprobe -v quiet -select_streams a:0 -show_entries stream=sample_fmt -of csv=p=0 input.wav
音量控制
基本音量调整
# 音量加倍
ffmpeg -i input.mp4 -af "volume=2.0" output.mp4
# 音量减半
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4
# 使用分贝
ffmpeg -i input.mp4 -af "volume=10dB" output.mp4
ffmpeg -i input.mp4 -af "volume=-10dB" output.mp4
# 静音
ffmpeg -i input.mp4 -af "volume=0" output.mp4
音量表达式
# 根据时间调整音量
ffmpeg -i input.mp4 -af "volume='if(lt(t,10),1,0.5)'" output.mp4
# 淡入效果
ffmpeg -i input.mp4 -af "volume='if(lt(t,2),t/2,1)'" output.mp4
# 淡出效果
ffmpeg -i input.mp4 -af "volume='if(gt(t,58),(60-t)/2,1)'" output.mp4
音量归一化
# 响度归一化(EBU R128)
ffmpeg -i input.mp4 -af "loudnorm=I=-16:TP=-1.5:LRA=11" output.mp4
# 峰值归一化
ffmpeg -i input.mp4 -af "peaknorm=0.95" output.mp4
# RMS 归一化
ffmpeg -i input.mp4 -af "volumedetect" -f null -
# 然后根据检测结果调整
ffmpeg -i input.mp4 -af "volume=5dB" output.mp4
loudnorm 参数
| 参数 | 说明 | 推荐值 |
|---|
| I | 集成响度(LUFS) | -16(流媒体)/-23(广播) |
| TP | 真峰值(dBTP) | -1.5 |
| LRA | 响度范围(LU) | 11 |
| dual_mono | 双单声道处理 | false |
| print_format | 输出格式 | summary/none |
音量检测
# 检测音量统计
ffmpeg -i input.mp4 -af "volumedetect" -f null - 2>&1 | grep -E "mean_volume|max_volume"
# 检测响度
ffmpeg -i input.mp4 -af "ebur128=peak=true" -f null - 2>&1 | grep -E "I:|LRA:|TP:"
淡入淡出
基本淡入淡出
# 淡入(前 3 秒)
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=3" output.mp4
# 淡出(最后 3 秒)
ffmpeg -i input.mp4 -af "afade=t=out:st=57:d=3" output.mp4
# 淡入淡出组合
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=3,afade=t=out:st=57:d=3" output.mp4
淡入淡出曲线
| 曲线 | 说明 |
|---|
| tri | 三角形(线性) |
| qsin | 正弦曲线 |
| esin | 指数正弦曲线 |
| hsin | 双曲正弦曲线 |
| log | 对数曲线 |
| ipar | 倒抛物线 |
| qua | 二次曲线 |
| cub | 三次曲线 |
| squ | 平方曲线 |
| cbr | 立方根曲线 |
| par | 抛物线曲线 |
| exp | 指数曲线 |
| iqsin | 反正弦曲线 |
| ihsi | 反双曲正弦曲线 |
| des | 指数衰减曲线 |
| dese | 双指数衰减曲线 |
| cos | 余弦曲线 |
| sin | 正弦曲线 |
# 使用不同曲线
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=3:curve=exp" output.mp4
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=3:curve=cos" output.mp4
交叉淡化
# 两个音频交叉淡化
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0]afade=t=out:st=4:d=2[a1];[1]afade=t=in:st=0:d=2[a2];[a1][a2]amix=inputs=2:duration=longest" output.mp3
音频裁剪
基本裁剪
# 按时间裁剪
ffmpeg -i input.mp3 -ss 00:01:00 -t 30 output.mp3
# 按时间范围裁剪
ffmpeg -i input.mp3 -ss 00:01:00 -to 00:02:00 output.mp3
# 裁剪前 30 秒
ffmpeg -i input.mp3 -t 30 output.mp3
# 裁剪后 30 秒
ffmpeg -i input.mp3 -sseof -30 output.mp3
精确裁剪
# 精确裁剪(需要重新编码)
ffmpeg -i input.mp3 -ss 00:01:00 -t 30 -c:a libmp3lame output.mp3
# 快速裁剪(不精确)
ffmpeg -i input.mp3 -ss 00:01:00 -t 30 -c copy output.mp3
音频拼接
基本拼接
# 使用 concat 滤镜
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" output.mp3
# 多个文件拼接
ffmpeg -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 \
-filter_complex "[0:a][1:a][2:a]concat=n=3:v=0:a=1" output.mp3
使用文件列表拼接
# 创建文件列表
cat > filelist.txt << 'EOF'
file 'audio1.mp3'
file 'audio2.mp3'
file 'audio3.mp3'
EOF
# 拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp3
带间隔的拼接
# 添加 2 秒间隔
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex \
"[0:a]apad=pad_dur=2[a0]; \
[a0][1:a]concat=n=2:v=0:a=1" \
output.mp3
混音
基本混音
# 混合两个音频
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" \
output.mp3
# 混合三个音频
ffmpeg -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 \
-filter_complex "[0:a][1:a][2:a]amix=inputs=3:duration=longest" \
output.mp3
amix 参数
| 参数 | 说明 | 默认值 |
|---|
| inputs | 输入数量 | 2 |
| duration | 输出时长策略 | longest |
| dropout_transition | 输入结束时的过渡时间 | 2 |
| weights | 各输入权重 | 1 1 … |
| normalize | 是否归一化 | true |
混音权重
# 设置权重
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:weights=1 0.5:duration=longest" \
output.mp3
# 降低背景音乐音量
ffmpeg -i music.mp3 -i voice.mp3 \
-filter_complex "[0:a]volume=0.3[music];[music][1:a]amix=inputs=2:duration=longest" \
output.mp3
混音持续时间
# 以最短输入为准
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=shortest" \
output.mp3
# 以最长输入为准
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" \
output.mp3
# 以第一个输入为准
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=first" \
output.mp3
均衡器
基本均衡器
# 低音增强
ffmpeg -i input.mp3 -af "bass=g=10" output.mp3
# 高音增强
ffmpeg -i input.mp3 -af "treble=g=10" output.mp3
# 低音和高音调整
ffmpeg -i input.mp3 -af "bass=g=5,treble=g=3" output.mp3
equalizer 滤镜
# 调整特定频率
ffmpeg -i input.mp3 -af "equalizer=f=1000:t=q:w=2:g=5" output.mp3
# 参数说明
# f: 中心频率
# t: 滤波器类型 (h=高通, l=低通, b=带通, p=峰值, n=陷波)
# w: 带宽
# g: 增益 (dB)
多频段均衡器
# 10 段均衡器
ffmpeg -i input.mp3 -af \
"equalizer=f=31:t=q:w=1:g=0,\
equalizer=f=62:t=q:w=1:g=0,\
equalizer=f=125:t=q:w=1:g=0,\
equalizer=f=250:t=q:w=1:g=0,\
equalizer=f=500:t=q:w=1:g=0,\
equalizer=f=1000:t=q:w=1:g=0,\
equalizer=f=2000:t=q:w=1:g=0,\
equalizer=f=4000:t=q:w=1:g=0,\
equalizer=f=8000:t=q:w=1:g=0,\
equalizer=f=16000:t=q:w=1:g=0" \
output.mp3
预设均衡器
# 摇滚风格
ffmpeg -i input.mp3 -af "bass=g=5,equalizer=f=250:t=q:w=1:g=2,equalizer=f=1000:t=q:w=1:g=4,equalizer=f=4000:t=q:w=1:g=5" output.mp3
# 流行风格
ffmpeg -i input.mp3 -af "bass=g=3,treble=g=3,equalizer=f=2000:t=q:w=1:g=2" output.mp3
# 古典风格
ffmpeg -i input.mp3 -af "equalizer=f=100:t=q:w=1:g=-2,treble=g=2" output.mp3
音频降噪
基本降噪
# 使用 afftdn 降噪
ffmpeg -i input.mp3 -af "afftdn=nf=-25" output.mp3
# 使用 anlmdn 降噪
ffmpeg -i input.mp3 -af "anlmdn=s=7" output.mp3
afftdn 参数
| 参数 | 说明 | 默认值 |
|---|
| nf | 噪声底限 (dB) | -50 |
| nt | 噪声类型 | w (白噪声) |
| om | 输出模式 | o (输出) |
| ai | 自适应初始状态 | y |
| aa | 自适应平均 | y |
| sigma | 噪声标准差 | 0.02 |
| 噪声类型 | 说明 | |
| ———- | —— | |
| w | 白噪声 | |
| v | 布朗噪声 | |
| s | 粉红噪声 | |
| p | 脉冲噪声 | |
# 白噪声降噪
ffmpeg -i input.mp3 -af "afftdn=nf=-25:nt=w" output.mp3
# 粉红噪声降噪
ffmpeg -i input.mp3 -af "afftdn=nf=-25:nt=s" output.mp3
噪声门
# 噪声门
ffmpeg -i input.mp3 -af "highpass=f=200,lowpass=f=3000" output.mp3
# 动态噪声门
ffmpeg -i input.mp3 -af "silenceremove=start_periods=1:start_duration=0.5:start_threshold=-50dB" output.mp3
完整降噪流程
#!/bin/bash
# denoise_audio.sh
INPUT=$1
OUTPUT=$2
# 降噪流程:降噪 -> 高通滤波 -> 归一化
ffmpeg -y -i "$INPUT" \
-af "afftdn=nf=-25,highpass=f=80,loudnorm=I=-16:TP=-1.5:LRA=11" \
"$OUTPUT"
echo "降噪完成: $OUTPUT"
音频滤波
高通滤波器
# 移除低频噪声
ffmpeg -i input.mp3 -af "highpass=f=80" output.mp3
# 强低频截止
ffmpeg -i input.mp3 -af "highpass=f=200" output.mp3
低通滤波器
# 移除高频噪声
ffmpeg -i input.mp3 -af "lowpass=f=8000" output.mp3
# 强高频截止
ffmpeg -i input.mp3 -af "lowpass=f=3000" output.mp3
带通滤波器
# 保留特定频段
ffmpeg -i input.mp3 -af "bandpass=f=1000:w=500" output.mp3
# 带阻滤波器(陷波)
ffmpeg -i input.mp3 -af "bandreject=f=1000:w=100" output.mp3
动态范围压缩
# 基本压缩
ffmpeg -i input.mp3 -af "acompressor=threshold=0.05:ratio=4:attack=5:release=50" output.mp3
# 参数说明
# threshold: 阈值
# ratio: 压缩比
# attack: 起始时间 (ms)
# release: 释放时间 (ms)
# makeup: 增益补偿 (dB)
# knee: 拐点宽度 (dB)
# 语音压缩
ffmpeg -i input.mp3 -af "acompressor=threshold=0.02:ratio=8:attack=1:release=100:makeup=8" output.mp3
速度调整
基本速度调整
# 加速 2 倍
ffmpeg -i input.mp3 -af "atempo=2.0" output.mp3
# 减速到 0.5 倍
ffmpeg -i input.mp3 -af "atempo=0.5" output.mp3
# 微调速度
ffmpeg -i input.mp3 -af "atempo=1.1" output.mp3
多级速度调整
# 极端加速(atempo 范围 0.5-2.0,需要多次使用)
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" output.mp3 # 4 倍速
ffmpeg -i input.mp3 -af "atempo=0.5,atempo=0.5" output.mp3 # 0.25 倍速
速度调整保持音调
# 加速并保持音调
ffmpeg -i input.mp3 -af "atempo=1.5" output.mp3
# 使用 rubberband 滤镜(如果可用)
ffmpeg -i input.mp3 -af "rubberband=tempo=1.5" output.mp3
声道操作
声道提取
# 提取左声道
ffmpeg -i input.mp4 -af "pan=mono|c0=c0" output_left.wav
# 提取右声道
ffmpeg -i input.mp4 -af "pan=mono|c0=c1" output_right.wav
声道合并
# 合并两个单声道为立体声
ffmpeg -i left.wav -i right.wav \
-filter_complex "[0:a][1:a]amerge=inputs=2" \
output_stereo.wav
声道交换
# 交换左右声道
ffmpeg -i input.mp4 -af "pan=stereo|c0=c1|c1=c0" output.mp4
声道混音
# 立体声转单声道
ffmpeg -i input.mp4 -ac 1 output_mono.mp4
# 使用 pan 滤镜混音
ffmpeg -i input.mp4 -af "pan=mono|c0=0.5*c0+0.5*c1" output_mono.mp4
# 立体声转 5.1
ffmpeg -i input.mp4 -af "pan=5.1|c0=c0|c1=c1|c2=c2|c3=c3|c4=0.5*c0+0.5*c1|c5=LFE" output_5.1.mp4
变调
基本变调
# 升高音调
ffmpeg -i input.mp3 -af "asetrate=44100*1.2,aresample=44100" output.mp3
# 降低音调
ffmpeg -i input.mp3 -af "asetrate=44100*0.8,aresample=44100" output.mp3
使用 rubberband 变调
# 升高半音
ffmpeg -i input.mp3 -af "rubberband=pitch=1.059463" output.mp3
# 降低半音
ffmpeg -i input.mp3 -af "rubberband=pitch=0.943874" output.mp3
# 升高一个八度
ffmpeg -i input.mp3 -af "rubberband=pitch=2.0" output.mp3
音频特效
回声效果
# 基本回声
ffmpeg -i input.mp3 -af "aecho=0.8:0.88:60:0.4" output.mp3
# 参数说明
# in_gain: 输入增益
# out_gain: 输出增益
# delays: 延迟时间 (ms)
# decays: 衰减系数
# 多重回声
ffmpeg -i input.mp3 -af "aecho=0.8:0.9:1000|1500|2000:0.3|0.2|0.1" output.mp3
混响效果
# 基本混响
ffmpeg -i input.mp3 -af "aecho=0.8:0.7:40:0.5" output.mp3
# 使用高级混响
ffmpeg -i input.mp3 -af "arnndn=m=rnnoise/model.rnnn" output.mp3
合唱效果
# 合唱效果
ffmpeg -i input.mp3 -af "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3" output.mp3
颤音效果
# 颤音效果
ffmpeg -i input.mp3 -af "vibrato=f=5:d=0.2" output.mp3
# 参数说明
# f: 频率 (Hz)
# d: 深度 (0-1)
批量处理
批量音频转换
#!/bin/bash
# batch_audio_convert.sh
INPUT_DIR=${1:-.}
OUTPUT_DIR=${2:-output}
FORMAT=${3:-mp3}
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.wav; do
filename=$(basename "$file" .wav)
output="$OUTPUT_DIR/${filename}.${FORMAT}"
echo "转换: $file -> $output"
ffmpeg -y -i "$file" -c:a libmp3lame -q:a 2 "$output"
done
echo "批量转换完成"
批量音量归一化
#!/bin/bash
# batch_normalize.sh
INPUT_DIR=${1:-.}
OUTPUT_DIR=${2:-normalized}
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.mp3; do
filename=$(basename "$file")
output="$OUTPUT_DIR/$filename"
echo "归一化: $file"
ffmpeg -y -i "$file" -af "loudnorm=I=-16:TP=-1.5:LRA=11" -c:a libmp3lame -q:a 2 "$output"
done
echo "批量归一化完成"
注意事项
- 采样率匹配:处理多个音频时确保采样率一致
- 位深度选择:处理时使用高精度,输出时根据需求选择
- 滤镜顺序:滤镜按顺序执行,顺序不同结果可能不同
- 音量限制:避免音量超过 0dBFS,否则会削波
- 编解码器选择:无损处理使用 FLAC 或 WAV
业务场景
场景 1:播客处理
# 播客处理流程:降噪 -> 压缩 -> 归一化
ffmpeg -i podcast_raw.wav \
-af "afftdn=nf=-25,acompressor=threshold=0.02:ratio=8:attack=1:release=100,loudnorm=I=-16:TP=-1.5:LRA=11" \
podcast_final.mp3
场景 2:音乐制作
# 音乐处理:均衡 -> 压缩 -> 混响
ffmpeg -i music.wav \
-af "bass=g=3,treble=g=2,acompressor=threshold=0.05:ratio=4:attack=5:release=50,aecho=0.8:0.7:40:0.3" \
music_processed.mp3
场景 3:语音识别预处理
# 语音处理:降噪 -> 高通 -> 归一化
ffmpeg -i speech.wav \
-af "afftdn=nf=-30,highpass=f=100,lowpass=f=8000,loudnorm=I=-16:TP=-1.5:LRA=11" \
-ar 16000 -ac 1 \
speech_processed.wav
场景 4:背景音乐混合
# 背景音乐 + 旁白
ffmpeg -i music.mp3 -i voiceover.mp3 \
-filter_complex \
"[0:a]volume=0.2[music]; \
[1:a]loudnorm=I=-16:TP=-1.5:LRA=11[voice]; \
[music][voice]amix=inputs=2:duration=longest:weights=1 1" \
final.mp3
扩展阅读
- FFmpeg 音频滤镜文档
- FFmpeg 音频编解码器
- EBU R128 响度标准
- 音频处理最佳实践
总结
本章介绍了 FFmpeg 的音频处理功能,包括:
- 采样率、位深度、声道布局转换
- 音量控制与归一化
- 淡入淡出效果
- 音频裁剪与拼接
- 混音与均衡器
- 降噪与滤波
- 音频特效
掌握这些功能可以帮助您完成各种音频处理任务。