强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

FFmpeg 多媒体处理教程 / 音频处理

音频处理

概述

FFmpeg 提供了强大的音频处理功能,包括采样率转换、声道布局调整、音量控制、混音、均衡器、降噪等操作。这些功能主要通过音频滤镜(Audio Filter)实现。

音频基础概念

采样率

采样率(Sample Rate)表示每秒采集的样本数,单位为 Hz。

采样率质量适用场景
8000 Hz电话质量语音通话
16000 Hz宽带语音语音识别
22050 HzFM 广播低质量音乐
44100 HzCD 质量标准音乐
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-bit0-255低质量
16-bit-32768 到 32767CD 质量
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

声道布局

布局声道数说明
mono1单声道
stereo2立体声
2.13立体声 + 低音
5.16环绕声
7.18全景声
# 转换声道布局
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
flt32-bit 浮点4
dbl64-bit 浮点8
u8p无符号 8-bit 平面1
s16p有符号 16-bit 平面2
s32p有符号 32-bit 平面4
fltp32-bit 浮点平面4
dblp64-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 "批量归一化完成"

注意事项

  1. 采样率匹配:处理多个音频时确保采样率一致
  2. 位深度选择:处理时使用高精度,输出时根据需求选择
  3. 滤镜顺序:滤镜按顺序执行,顺序不同结果可能不同
  4. 音量限制:避免音量超过 0dBFS,否则会削波
  5. 编解码器选择:无损处理使用 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

扩展阅读

  1. FFmpeg 音频滤镜文档
  2. FFmpeg 音频编解码器
  3. EBU R128 响度标准
  4. 音频处理最佳实践

总结

本章介绍了 FFmpeg 的音频处理功能,包括:

  • 采样率、位深度、声道布局转换
  • 音量控制与归一化
  • 淡入淡出效果
  • 音频裁剪与拼接
  • 混音与均衡器
  • 降噪与滤波
  • 音频特效

掌握这些功能可以帮助您完成各种音频处理任务。