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

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

音频处理

概述

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 "批量归一化完成"

注意事项

  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 的音频处理功能,包括:

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

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