🎬 FFmpeg 音频处理基础

FFmpeg 是一个开源的跨平台音视频处理工具,可以录制、转换、流式传输音视频。它提供了强大的命令行接口来处理音频文件。

FFmpeg 核心组件

  • ffmpeg:音视频转码、合成工具
  • ffprobe:媒体文件分析工具
  • ffplay:简易媒体播放器
  • libavcodec:音视频编解码库
  • libavformat:音视频格式封装库

安装 FFmpeg

# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows (使用 Chocolatey)
choco install ffmpeg

# 验证安装
ffmpeg -version
ffprobe -version

📊 音频文件信息查看

使用 ffprobe 可以查看音频文件的详细信息,包括编码格式、采样率、位深度、声道数等。

查看音频文件基本信息

# 查看音频文件详细信息
ffprobe -i input.mp3

# 以 JSON 格式输出
ffprobe -i input.mp3 -print_format json -show_format -show_streams

# 只显示音频流信息
ffprobe -i input.mp3 -select_streams a -show_entries stream=codec_name,channels,sample_rate,bit_rate -of default=noprint_wrappers=1

# 查看音频时长
ffprobe -i input.mp3 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1
FFprobe 音频分析流程 音频文件 input.mp3 WAV/FLAC 等 FFprobe 解析容器 提取元数据 输出信息 编码/采样率 声道/比特率 典型输出示例 Input #0, mp3, from 'input.mp3': Duration: 00:03:45.67, start: 0.000000 Audio: mp3, 44100 Hz, stereo, 192 kb/s → 时长:3 分 45 秒 → 采样率:44.1kHz → 比特率:192kbps

🔄 音频格式转换

FFmpeg 支持几乎所有常见的音频格式之间的相互转换。

基本格式转换

# MP3 转 WAV(无损)
ffmpeg -i input.mp3 output.wav

# WAV 转 MP3(指定比特率)
ffmpeg -i input.wav -b:a 320k output.mp3

# 转换为 FLAC(无损压缩)
ffmpeg -i input.wav output.flac

# 转换为 AAC(高质量)
ffmpeg -i input.wav -c:a aac -b:a 256k output.m4a

# 转换为 OGG(开源格式)
ffmpeg -i input.wav -c:a libvorbis -q:a 10 output.ogg

批量格式转换

# 批量转换当前目录所有 WAV 为 MP3
for file in *.wav; do
    ffmpeg -i "$file" -b:a 320k "${file%.wav}.mp3"
done

# 使用 find 批量转换子目录中的文件
find . -name "*.wav" -exec ffmpeg -i {} -b:a 256k {}.mp3 \;
格式 类型 特点 适用场景
WAV 无损 未压缩,文件大 专业音频编辑
MP3 有损 兼容性好,文件小 音乐播放、流媒体
FLAC 无损压缩 压缩率约 50% 音乐收藏、存档
AAC 有损 同码率音质优于 MP3 Apple 设备、流媒体
OGG 有损 开源免费 游戏音频、开源项目

⚙️ 音频参数调整

FFmpeg 可以精确控制音频的各种参数,包括采样率、位深度、声道数、比特率等。

采样率转换

# 重采样到 44.1kHz(CD 标准)
ffmpeg -i input.wav -ar 44100 output_44k.wav

# 重采样到 48kHz(视频标准)
ffmpeg -i input.wav -ar 48000 output_48k.wav

# 重采样到 96kHz(高解析度)
ffmpeg -i input.wav -ar 96000 output_96k.wav

# 降采样到 8kHz(电话音质)
ffmpeg -i input.wav -ar 8000 output_phone.wav

声道处理

# 立体声转单声道
ffmpeg -i input.wav -ac 1 output_mono.wav

# 单声道转立体声
ffmpeg -i input_mono.wav -ac 2 output_stereo.wav

# 5.1 环绕声转立体声
ffmpeg -i input_5.1.wav -ac 2 output_stereo.wav

# 提取特定声道(提取左声道)
ffmpeg -i input.wav -af "pan=mono|c0=FL" output_left.wav

比特率控制

# 固定比特率 (CBR)
ffmpeg -i input.wav -b:a 192k output_cbr.mp3

# 可变比特率 (VBR) - 质量优先
ffmpeg -i input.wav -q:a 2 output_vbr.mp3

# 平均比特率 (ABR)
ffmpeg -i input.wav -b:a 256k -q:a 2 output_abr.mp3

# 比特率对照表
# 64k   - 语音/播客
# 128k  - 标准音质
# 192k  - 良好音质
# 320k  - 高质量/CD 音质

🎚️ 音频滤镜处理

FFmpeg 提供了丰富的音频滤镜,可以进行音量调整、均衡器、混响、变速等各种处理。

音量调整

# 增加音量(+3dB)
ffmpeg -i input.wav -af "volume=+3dB" output_louder.wav

# 降低音量(-6dB)
ffmpeg -i input.wav -af "volume=-6dB" output_quieter.wav

# 音量标准化(峰值归一化)
ffmpeg -i input.wav -af "volumedetect" -f null -

# 动态范围压缩
ffmpeg -i input.wav -af "acompressor=threshold=0.089:ratio=9:attack=200:release=1000" output_compressed.wav

均衡器处理

# 三段均衡器(低音 + 中音 + 高音)
ffmpeg -i input.wav -af "equalizer=f=100:t=q:w=100:g=5,equalizer=f=1000:t=q:w=500:g=-3,equalizer=f=8000:t=q:w=2000:g=3" output_eq.wav

# 低音增强
ffmpeg -i input.wav -af "bass=g=5:f=100" output_bass.wav

# 高音增强
ffmpeg -i input.wav -af "treble=g=5:f=5000" output_treble.wav

# 低通滤波器(只保留低频)
ffmpeg -i input.wav -af "lowpass=f=1000" output_lowpass.wav

# 高通滤波器(只保留高频)
ffmpeg -i input.wav -af "highpass=f=2000" output_highpass.wav

时间与音高调整

# 加速播放(1.5 倍速)
ffmpeg -i input.wav -af "atempo=1.5" output_faster.wav

# 减速播放(0.75 倍速)
ffmpeg -i input.wav -af "atempo=0.75" output_slower.wav

# 变速不变调(范围 0.5-2.0)
ffmpeg -i input.wav -af "atempo=1.25" output_tempo.wav

# 变调不变速(半音为单位)
ffmpeg -i input.wav -af "asetrate=44100*1.059463,aresample=44100" output_pitch_up.wav
FFmpeg 音频滤镜处理链 原始音频 input.wav 44.1kHz/16bit volume 音量调整 +3dB equalizer 均衡器 三段 EQ acompressor 动态压缩 阈值/ratio 输出音频 output.wav 处理后 常用滤镜组合示例 播客处理链: volume=+2dB → highpass=f=80 → equalizer → acompressor → limiter 音乐母带处理: equalizer(三段) → acompressor → alimiter → volumedetect → 多个滤镜用逗号连接

✂️ 音频剪辑与合并

FFmpeg 可以精确地剪辑音频片段,也可以将多个音频文件合并成一个。

音频剪辑

# 从 30 秒开始截取 60 秒
ffmpeg -i input.wav -ss 00:00:30 -t 00:01:00 -c copy output.wav

# 从 1 分 30 秒截取到 2 分 45 秒
ffmpeg -i input.wav -ss 00:01:30 -to 00:02:45 -c copy output.wav

# 精确剪辑(先 -ss 更快)
ffmpeg -ss 00:00:10 -i input.wav -t 00:00:30 -c:a pcm_s16le output.wav

# 淡入淡出效果
ffmpeg -i input.wav -af "afade=t=in:st=0:d=3,afade=t=out:st=57:d=3" output_fade.wav

音频合并

# 方法 1:使用 concat 协议(相同格式)
echo "file 'part1.wav'" > list.txt
echo "file 'part2.wav'" >> list.txt
echo "file 'part3.wav'" >> list.txt
ffmpeg -f concat -i list.txt -c copy output.wav

# 方法 2:使用 concat 滤镜(可处理不同格式)
ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:0][1:0]concat=n=2:v=0:a=1[out]" -map "[out]" output.wav

# 方法 3:批量合并当前目录所有 MP3
for f in *.mp3; do echo "file '$f'"; done > list.txt
ffmpeg -f concat -i list.txt -c copy merged.mp3

音频混合

# 混合两个音频文件(叠加)
ffmpeg -i background.wav -i voice.wav -filter_complex "amix=inputs=2:duration=first:dropout_transition=3" output_mix.wav

# 背景音乐 + 人声(调整音量比例)
ffmpeg -i bgm.wav -i voice.wav -filter_complex "[0:0]volume=0.3[bg];[bg][1:0]amix=inputs=2:duration=first" output.wav

# 交叉淡入淡出混合
ffmpeg -i song1.wav -i song2.wav -filter_complex "[0:0][1:0]acrossfade=d=10:c1=tri:c2=tri" output_crossfade.wav

🎵 音频提取与分离

从视频中提取音频,或从立体声中分离特定声道。

从视频提取音频

# 提取音频为 WAV(无损)
ffmpeg -i video.mp4 -vn -acodec pcm_s16le audio.wav

# 提取音频为 MP3(320k)
ffmpeg -i video.mp4 -vn -b:a 320k audio.mp3

# 提取音频为 AAC
ffmpeg -i video.mp4 -vn -c:a aac -b:a 256k audio.m4a

# 提取音频并标准化音量
ffmpeg -i video.mp4 -vn -af "loudnorm=I=-16:TP=-1.5:LRA=11" audio_normalized.wav

声道分离

# 分离左右声道为独立文件
ffmpeg -i stereo.wav -map_channel 0.0.0 -ac 1 left.wav
ffmpeg -i stereo.wav -map_channel 0.0.1 -ac 1 right.wav

# 使用 pan 滤镜分离声道
ffmpeg -i stereo.wav -af "pan=mono|c0=FL" left_only.wav
ffmpeg -i stereo.wav -af "pan=mono|c0=FR" right_only.wav

# 交换左右声道
ffmpeg -i input.wav -af "pan=stereo|c0=c1|c1=c0" swapped.wav

📈 音频可视化与分析

FFmpeg 可以生成音频的频谱图、波形图等可视化内容。

生成频谱图

# 生成音频频谱图
ffmpeg -i input.wav -filter_complex "showspectrumpic=s=1280x720:legend=1" spectrum.png

# 生成彩色频谱图
ffmpeg -i input.wav -filter_complex "showspectrumpic=s=1920x1080:color=intensity:legend=1:scale=lin" spectrum_hd.png

# 生成声波图
ffmpeg -i input.wav -filter_complex "showwavespic=s=1280x720:colors=blue|red" waveform.png
音频频谱图示例 0Hz 10kHz 22kHz 强度

🔧 高级技巧与批处理

音频标准化

# EBU R128 响度标准化(播客标准)
ffmpeg -i input.wav -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=summary" output_normalized.wav

# 峰值标准化(-1dB 峰值)
ffmpeg -i input.wav -af "alimiter=limit=-1dB" output_limited.wav

# 批量标准化多个文件
for file in *.wav; do
    ffmpeg -i "$file" -af "loudnorm=I=-16:TP=-1.5" "${file%.wav}_normalized.wav"
done

降噪处理

# 使用 RNNoise 降噪(需要编译支持)
ffmpeg -i noisy.wav -af "arnndn=model=rnnoise_data/tt.rnn" output_clean.wav

# 简单高通滤波去除低频噪音
ffmpeg -i input.wav -af "highpass=f=80" output_hp.wav

# 去除恒定频率噪音(如交流声)
ffmpeg -i input.wav -af "notch=f=50:width_type=q:width=10" output_no_hum.wav

实用脚本示例

#!/bin/bash
# 批量转换音频文件为 MP3(320k)
for file in *.wav *.flac *.m4a; do
    [ -f "$file" ] || continue
    echo "处理:$file"
    ffmpeg -i "$file" -b:a 320k "${file%.*}.mp3" -y
done

#!/bin/bash
# 批量提取视频中的音频
for video in *.mp4 *.mov *.avi; do
    [ -f "$video" ] || continue
    echo "提取:$video"
    ffmpeg -i "$video" -vn -b:a 256k "${video%.*}.m4a" -y
done

⚠️ 注意事项

  • 使用 -c copy 可以避免重新编码,保持原质量且速度更快
  • 多次有损压缩会累积质量损失,尽量保持原始文件
  • 处理前先用 ffprobe 查看源文件参数
  • 批量处理时先用少量文件测试命令

📚 常用命令速查表

任务 命令
查看音频信息 ffprobe -i input.mp3
MP3 转 WAV ffmpeg -i input.mp3 output.wav
WAV 转 MP3(320k) ffmpeg -i input.wav -b:a 320k output.mp3
改变采样率 ffmpeg -i input.wav -ar 48000 output.wav
立体声转单声道 ffmpeg -i input.wav -ac 1 output.wav
剪辑音频 ffmpeg -i input.wav -ss 00:00:30 -t 00:01:00 -c copy output.wav
合并音频 ffmpeg -f concat -i list.txt -c copy output.wav
调整音量 ffmpeg -i input.wav -af "volume=+3dB" output.wav
变速播放 ffmpeg -i input.wav -af "atempo=1.5" output.wav
从视频提取音频 ffmpeg -i video.mp4 -vn -b:a 256k audio.m4a
生成频谱图 ffmpeg -i input.wav -filter_complex "showspectrumpic" spectrum.png
响度标准化 ffmpeg -i input.wav -af "loudnorm=I=-16:TP=-1.5" output.wav
↑ 返回顶部