🎬 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
🔄 音频格式转换
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 可以精确地剪辑音频片段,也可以将多个音频文件合并成一个。
音频剪辑
# 从 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
🔧 高级技巧与批处理
音频标准化
# 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 |