音频相关知识
- [1 声音的物理本质](#1 声音的物理本质)
-
- [1.1 什么是声音](#1.1 什么是声音)
- [1.2 声音的三要素](#1.2 声音的三要素)
- [2 PCM ------ 数字音频的基础](#2 PCM —— 数字音频的基础)
-
- [2.1 什么是 PCM](#2.1 什么是 PCM)
- [2.2 采样率(Sample Rate)](#2.2 采样率(Sample Rate))
- [2.3 位深 / 采样精度(Bit Depth)](#2.3 位深 / 采样精度(Bit Depth))
- [2.4 声道数与声道布局(Channels & Channel Layout)](#2.4 声道数与声道布局(Channels & Channel Layout))
- [2.5 交错存储与平面存储](#2.5 交错存储与平面存储)
- [2.6 音频帧(Audio Frame)](#2.6 音频帧(Audio Frame))
- [2.7 音频数据量计算](#2.7 音频数据量计算)
- [3 分贝与响度](#3 分贝与响度)
-
- [3.1 分贝(dB)](#3.1 分贝(dB))
- [3.2 dBFS(分贝满量程)](#3.2 dBFS(分贝满量程))
- [3.3 响度标准(LUFS / LKFS)](#3.3 响度标准(LUFS / LKFS))
- [4 常见音频编码格式对比](#4 常见音频编码格式对比)
-
- [4.1 无损格式](#4.1 无损格式)
- [4.2 有损格式](#4.2 有损格式)
- [4.3 格式对比总结](#4.3 格式对比总结)
- [5 用 FFmpeg 验证音频概念](#5 用 FFmpeg 验证音频概念)
-
- [5.1 查看音频文件信息](#5.1 查看音频文件信息)
- [5.2 PCM 原始数据的播放](#5.2 PCM 原始数据的播放)
- [5.3 格式转换](#5.3 格式转换)
- [5.4 提取 PCM 原始数据](#5.4 提取 PCM 原始数据)
同系列文章
ffmpeg(1)-图片相关知识
ffmpeg(2)_-音频相关知识
1 声音的物理本质
1.1 什么是声音
描述 :声音是由物体振动产生的机械波,通过空气(或其他介质)传播到人耳。计算机无法直接存储声波,需要将模拟信号转换为数字信号,这个过程叫做模数转换(A/D转换)。
核心过程:
麦克风拾音 → 模拟电信号 → A/D转换(采样+量化) → 数字音频数据(PCM)
1.2 声音的三要素
频率(Frequency):振动的快慢,单位是赫兹(Hz)。频率越高,音调越高。人耳可听范围约 20Hz ~ 20000Hz。
振幅(Amplitude):振动的幅度,决定音量大小。振幅越大,声音越响。
音色(Timbre):由波形的谐波成分决定。同样的音高,钢琴和吉他听起来不同,就是因为音色不同。
人耳对频率的感知不是线性的,对 1000Hz ~ 4000Hz 范围最敏感,这也是人声的主要频率范围
2 PCM ------ 数字音频的基础
2.1 什么是 PCM
描述:PCM(Pulse Code Modulation,脉冲编码调制)是最原始的数字音频表示方式,未经任何压缩。所有音频编码格式(MP3、AAC 等)最终解码后都会还原为 PCM 数据。
地位:PCM 之于音频,就像 RGB/YUV 之于图像 ------ 是最底层的原始数据。
2.2 采样率(Sample Rate)
描述:每秒钟对模拟信号采集的次数,单位是 Hz。
奈奎斯特定理:采样率必须至少是信号最高频率的 2 倍,才能无失真地还原原始信号。人耳上限约 20000Hz,因此采样率至少需要 40000Hz。
常见采样率:
8000 Hz :电话语音,质量较低
16000 Hz :语音识别、VoIP 常用
22050 Hz :早期多媒体,FM 广播级别
44100 Hz :CD 标准(44100 = 2 × 20000 + 余量,覆盖人耳全频段)
48000 Hz :视频/广播标准(DVD、蓝光、专业音频设备)
96000 Hz :高清音频(Hi-Res Audio)
192000 Hz :录音棚级别,极高精度
44100Hz 的来源:早期数字音频通过视频设备录制,PAL 制式每帧 625 行 × 每秒 25 帧 = 15625,NTSC 制式每帧 525 行 × 每秒 30 帧 = 15750,取交叉兼容值并乘以系数,最终确定为 44100
48000Hz 的来源:48000 能被更多整数整除(如 8000、16000、24000),便于不同采样率之间的转换,因此被视频和广播行业选为标准
2.3 位深 / 采样精度(Bit Depth)
描述:每个采样点用多少位(bit)来表示振幅值,位深越高,能表达的振幅级别越多,声音的动态范围越大。
常见位深:
8 位 :256 级量化,动态范围约 48 dB,质量较差(早期游戏音效)
16 位 :65536 级量化,动态范围约 96 dB,CD 标准
24 位 :16777216 级量化,动态范围约 144 dB,专业录音
32 位 :浮点格式(float),用于音频处理中间环节,避免精度损失
整数格式 vs 浮点格式:
S16(有符号16位整数):取值范围 -32768 ~ 32767,CD 标准格式
S32(有符号32位整数):取值范围 -2147483648 ~ 2147483647
FLT(32位浮点数) :取值范围 -1.0 ~ 1.0,精度高,适合中间处理
DBL(64位浮点数) :取值范围 -1.0 ~ 1.0,最高精度
FFmpeg 中的样本格式后缀带 P 表示平面存储(Planar),不带 P 表示交错存储(Interleaved),例如 S16 是交错的,S16P 是平面的。具体区别见 2.5 节
2.4 声道数与声道布局(Channels & Channel Layout)
描述:声道数表示同时有多少路独立的音频信号。声道布局描述每个声道在空间中的位置。
常见声道配置:
单声道(Mono) :1 个声道,用于语音通话、广播
立体声(Stereo) :2 个声道(左 L + 右 R),最常见的音乐格式
2.1 声道 :左 + 右 + 低音炮(LFE)
5.1 环绕声 :前左 + 前右 + 中置 + 左环绕 + 右环绕 + 低音炮,影院标准
7.1 环绕声 :在 5.1 基础上增加后左 + 后右环绕
5.1 声道的空间布局示意:
中置 (C)
|
前左 (FL) ------------ 前右 (FR)
\ /
\ 听众位置 /
/ \
左环绕 (SL) 右环绕 (SR)
低音炮 (LFE) ------ 位置不固定
2.5 交错存储与平面存储
描述:多声道 PCM 数据在内存中有两种排列方式,这个概念在 FFmpeg 开发中非常重要。
交错存储(Interleaved):不同声道的样本交替排列。
左样本1 | 右样本1 | 左样本2 | 右样本2 | 左样本3 | 右样本3 | ...
L1 R1 L2 R2 L3 R3
所有声道的数据存放在 AVFrame 的 data[0] 中
平面存储(Planar):每个声道的样本独立存放在连续的内存区域中。
data[0]: L1 | L2 | L3 | L4 | L5 | ... ← 左声道全部样本
data[1]: R1 | R2 | R3 | R4 | R5 | ... ← 右声道全部样本
每个声道的数据分别存放在 AVFrame 的 data[0]、data[1]、data[2]... 中
FFmpeg 中大多数解码器输出的是平面格式(如 AV_SAMPLE_FMT_FLTP),而大多数音频播放设备要求交错格式(如 AV_SAMPLE_FMT_S16),因此通常需要用 swresample 库进行转换
2.6 音频帧(Audio Frame)
描述:音频编解码器不是逐个样本处理的,而是以"帧"为单位。一个音频帧包含固定数量的采样点(称为 nb_samples 或 frame_size)。
常见编码器的每帧样本数:
AAC :1024 个样本/帧
MP3 :1152 个样本/帧
Opus :可变(120 / 240 / 480 / 960 / 1920 / 2880)
PCM(无压缩):无固定帧大小,可自定义
一帧音频数据的大小计算:
帧数据大小 = 每帧样本数 × 声道数 × 每样本字节数
例:AAC 解码后(S16 立体声)
1024 × 2 × 2 = 4096 字节
2.7 音频数据量计算
描述:未压缩 PCM 的数据量可以精确计算。
公式:
每秒数据量 = 采样率 × 声道数 × 每样本字节数(字节/秒)
每秒数据量 = 采样率 × 声道数 × 位深 / 8(字节/秒)
示例 ------ CD 质量音频(44100Hz / 16bit / 立体声):
每秒数据量 = 44100 × 2 × 16 / 8 = 176400 字节/秒 ≈ 172 KB/s
一分钟数据量 = 176400 × 60 = 10584000 字节 ≈ 10.1 MB
一首 4 分钟的歌 ≈ 40.3 MB(未压缩)
这就是为什么需要音频压缩编码 ------ 一首未压缩的歌曲约 40MB,而 MP3 压缩后仅约 4MB,AAC 压缩后可以更小
3 分贝与响度
3.1 分贝(dB)
描述:分贝是一个对数单位,用于衡量信号的强度比值,而非绝对值。
公式:
dB = 20 × log10(信号幅度 / 参考幅度)
关键数值:
0 dB :信号等于参考值
-6 dB :信号幅度减半(体感音量略有下降)
-20 dB :信号幅度降为 1/10
+6 dB :信号幅度翻倍
3.2 dBFS(分贝满量程)
描述:数字音频中以满量程(Full Scale)为参考点,0 dBFS 是数字系统能表示的最大幅度,所有信号值都 ≤ 0 dBFS。
数字音频中如果信号超过 0 dBFS 就会产生"削波失真"(Clipping),表现为刺耳的爆音
3.3 响度标准(LUFS / LKFS)
描述:LUFS(Loudness Units relative to Full Scale)是感知响度的度量标准,考虑了人耳对不同频率的灵敏度差异。
常见平台的响度标准:
YouTube :-14 LUFS
Spotify :-14 LUFS
Apple Music:-16 LUFS
广播电视 :-24 LUFS(EBU R128 标准)
FFmpeg 中可以使用 loudnorm 滤镜将音频标准化到指定的 LUFS 值
4 常见音频编码格式对比
4.1 无损格式
WAV(PCM):
压缩方式 :无压缩
文件大小 :极大(约 10MB/分钟,CD 质量)
质量 :完美保留原始数据
用途 :录音、音频编辑的中间格式
容器 :.wav
FLAC:
压缩方式 :无损压缩
压缩比 :约 50%~70%(原始大小的一半左右)
质量 :与原始 PCM 完全一致
用途 :高品质音乐存储与分发
容器 :.flac
ALAC(Apple Lossless):
压缩方式 :无损压缩
压缩比 :与 FLAC 接近
质量 :与原始 PCM 完全一致
用途 :Apple 生态系统
容器 :.m4a
4.2 有损格式
MP3:
压缩方式 :有损压缩(利用心理声学模型去除人耳不敏感的信号)
常见码率 :128kbps(一般)、192kbps(较好)、320kbps(最高)
压缩比 :约 1:10(CD 质量 → 128kbps)
兼容性 :最广泛,几乎所有设备支持
用途 :音乐分发、网络音频
容器 :.mp3
AAC(Advanced Audio Coding):
压缩方式 :有损压缩(MP3 的继任者,效率更高)
常见码率 :96kbps ~ 256kbps
优势 :同码率下质量优于 MP3
用途 :流媒体(YouTube、Apple Music)、视频音轨(MP4 默认音频编码)
容器 :.m4a / .mp4 / .aac
Opus:
压缩方式 :有损压缩(目前最先进的通用音频编码)
码率范围 :6kbps ~ 510kbps
优势 :低延迟(适合实时通信)、低码率下质量远超 MP3 和 AAC
用途 :WebRTC 语音通话、Discord、在线会议、流媒体
容器 :.opus / .ogg / .webm
Vorbis:
压缩方式 :有损压缩(开源免专利费)
常见码率 :128kbps ~ 320kbps
优势 :开源免费,质量接近 AAC
用途 :游戏音效、开源项目
容器 :.ogg
4.3 格式对比总结
| 格式 | 类型 | 压缩效率 | 延迟 | 兼容性 | 适用场景 |
|---|---|---|---|---|---|
| WAV | 无损 | 无压缩 | 无 | 极广 | 录音/编辑中间格式 |
| FLAC | 无损 | 约 50%~70% | 低 | 广 | 高品质音乐存储 |
| MP3 | 有损 | 约 1:10 | 中 | 最广 | 通用音乐分发 |
| AAC | 有损 | 优于 MP3 约 30% | 中 | 广 | 流媒体/视频音轨 |
| Opus | 有损 | 最高(低码率极优) | 极低 | 中 | 实时通信/流媒体 |
| Vorbis | 有损 | 接近 AAC | 中 | 中 | 游戏/开源项目 |
5 用 FFmpeg 验证音频概念
5.1 查看音频文件信息
使用 ffprobe 可以查看音频文件的详细信息:
bash
ffprobe -i input.mp3
输出中的关键字段:
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
^^^ ^^^^^^^^^ ^^^^^^ ^^^^ ^^^^^^^
编码器 采样率 声道 样本格式 码率
5.2 PCM 原始数据的播放
使用 ffplay 播放 PCM 原始数据时必须手动指定参数(因为 PCM 没有文件头信息):
bash
# 播放一个 44100Hz、16位有符号小端序、双声道的 PCM 文件
ffplay -f s16le -ar 44100 -ac 2 input.pcm
参数说明:
-f s16le :样本格式(s=有符号,16=16位,le=小端序)
-ar 44100 :采样率
-ac 2 :声道数
尝试修改 -ar 的值(比如改成 22050 或 88200)播放同一个文件,你会直观地听到采样率对声音的影响 ------ 22050 会变成低沉的慢放效果,88200 会变成尖锐的快进效果
5.3 格式转换
bash
# WAV 转 MP3(指定码率 320kbps)
ffmpeg -i input.wav -c:a libmp3lame -b:a 320k output.mp3
# WAV 转 AAC(指定码率 192kbps)
ffmpeg -i input.wav -c:a aac -b:a 192k output.m4a
# MP3 转 WAV(解码为无压缩 PCM)
ffmpeg -i input.mp3 output.wav
# 提取视频中的音频并转为 MP3
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3
# 将音频重采样为 16000Hz 单声道(常用于语音识别预处理)
ffmpeg -i input.wav -ar 16000 -ac 1 output_16k_mono.wav
5.4 提取 PCM 原始数据
bash
# 从 MP3 中提取 PCM(S16LE 格式)
ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le output.pcm
# 从视频中提取 PCM(指定采样率和声道)
ffmpeg -i video.mp4 -vn -f s16le -ar 44100 -ac 2 output.pcm
提取的 .pcm 文件是没有文件头的纯原始数据,播放时必须手动指定采样率、位深和声道数,否则无法正确解析(类似第一篇中的 .rgb 原始数据需要指定分辨率)