ffmpeg(2)-音频相关知识
音频相关知识1 声音的物理本质1.1 什么是声音1.2 声音的三要素2 PCM —— 数字音频的基础2.1 什么是 PCM2.2 采样率Sample Rate2.3 位深 / 采样精度Bit Depth2.4 声道数与声道布局Channels Channel Layout2.5 交错存储与平面存储2.6 音频帧Audio Frame2.7 音频数据量计算3 分贝与响度3.1 分贝dB3.2 dBFS分贝满量程3.3 响度标准LUFS / LKFS4 常见音频编码格式对比4.1 无损格式4.2 有损格式4.3 格式对比总结5 用 FFmpeg 验证音频概念5.1 查看音频文件信息5.2 PCM 原始数据的播放5.3 格式转换5.4 提取 PCM 原始数据同系列文章ffmpeg(1)-图片相关知识ffmpeg2_-音频相关知识1 声音的物理本质1.1 什么是声音描述声音是由物体振动产生的机械波通过空气或其他介质传播到人耳。计算机无法直接存储声波需要将模拟信号转换为数字信号这个过程叫做模数转换A/D转换。核心过程麦克风拾音 → 模拟电信号 → A/D转换采样量化 → 数字音频数据PCM1.2 声音的三要素频率Frequency振动的快慢单位是赫兹Hz。频率越高音调越高。人耳可听范围约 20Hz ~ 20000Hz。振幅Amplitude振动的幅度决定音量大小。振幅越大声音越响。音色Timbre由波形的谐波成分决定。同样的音高钢琴和吉他听起来不同就是因为音色不同。人耳对频率的感知不是线性的对 1000Hz ~ 4000Hz 范围最敏感这也是人声的主要频率范围2 PCM —— 数字音频的基础2.1 什么是 PCM描述PCMPulse 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 帧 15625NTSC 制式每帧 525 行 × 每秒 30 帧 15750取交叉兼容值并乘以系数最终确定为 4410048000Hz 的来源48000 能被更多整数整除如 8000、16000、24000便于不同采样率之间的转换因此被视频和广播行业选为标准2.3 位深 / 采样精度Bit Depth描述每个采样点用多少位bit来表示振幅值位深越高能表达的振幅级别越多声音的动态范围越大。常见位深8 位 256 级量化动态范围约 48 dB质量较差早期游戏音效 16 位 65536 级量化动态范围约 96 dBCD 标准 24 位 16777216 级量化动态范围约 144 dB专业录音 32 位 浮点格式float用于音频处理中间环节避免精度损失整数格式 vs 浮点格式S16有符号16位整数取值范围 -32768 ~ 32767CD 标准格式 S32有符号32位整数取值范围 -2147483648 ~ 2147483647 FLT32位浮点数 取值范围 -1.0 ~ 1.0精度高适合中间处理 DBL64位浮点数 取值范围 -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 压缩后仅约 4MBAAC 压缩后可以更小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描述LUFSLoudness Units relative to Full Scale是感知响度的度量标准考虑了人耳对不同频率的灵敏度差异。常见平台的响度标准YouTube -14 LUFS Spotify -14 LUFS Apple Music-16 LUFS 广播电视 -24 LUFSEBU R128 标准FFmpeg 中可以使用 loudnorm 滤镜将音频标准化到指定的 LUFS 值4 常见音频编码格式对比4.1 无损格式WAVPCM压缩方式 无压缩 文件大小 极大约 10MB/分钟CD 质量 质量 完美保留原始数据 用途 录音、音频编辑的中间格式 容器 .wavFLAC压缩方式 无损压缩 压缩比 约 50%~70%原始大小的一半左右 质量 与原始 PCM 完全一致 用途 高品质音乐存储与分发 容器 .flacALACApple Lossless压缩方式 无损压缩 压缩比 与 FLAC 接近 质量 与原始 PCM 完全一致 用途 Apple 生态系统 容器 .m4a4.2 有损格式MP3压缩方式 有损压缩利用心理声学模型去除人耳不敏感的信号 常见码率 128kbps一般、192kbps较好、320kbps最高 压缩比 约 1:10CD 质量 → 128kbps 兼容性 最广泛几乎所有设备支持 用途 音乐分发、网络音频 容器 .mp3AACAdvanced Audio Coding压缩方式 有损压缩MP3 的继任者效率更高 常见码率 96kbps ~ 256kbps 优势 同码率下质量优于 MP3 用途 流媒体YouTube、Apple Music、视频音轨MP4 默认音频编码 容器 .m4a / .mp4 / .aacOpus压缩方式 有损压缩目前最先进的通用音频编码 码率范围 6kbps ~ 510kbps 优势 低延迟适合实时通信、低码率下质量远超 MP3 和 AAC 用途 WebRTC 语音通话、Discord、在线会议、流媒体 容器 .opus / .ogg / .webmVorbis压缩方式 有损压缩开源免专利费 常见码率 128kbps ~ 320kbps 优势 开源免费质量接近 AAC 用途 游戏音效、开源项目 容器 .ogg4.3 格式对比总结格式类型压缩效率延迟兼容性适用场景WAV无损无压缩无极广录音/编辑中间格式FLAC无损约 50%~70%低广高品质音乐存储MP3有损约 1:10中最广通用音乐分发AAC有损优于 MP3 约 30%中广流媒体/视频音轨Opus有损最高低码率极优极低中实时通信/流媒体Vorbis有损接近 AAC中中游戏/开源项目5 用 FFmpeg 验证音频概念5.1 查看音频文件信息使用 ffprobe 可以查看音频文件的详细信息ffprobe-iinput.mp3输出中的关键字段Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s ^^^ ^^^^^^^^^ ^^^^^^ ^^^^ ^^^^^^^ 编码器 采样率 声道 样本格式 码率5.2 PCM 原始数据的播放使用 ffplay 播放 PCM 原始数据时必须手动指定参数因为 PCM 没有文件头信息# 播放一个 44100Hz、16位有符号小端序、双声道的 PCM 文件ffplay-fs16le-ar44100-ac2input.pcm参数说明-f s16le 样本格式s有符号1616位le小端序 -ar 44100 采样率 -ac 2 声道数尝试修改 -ar 的值比如改成 22050 或 88200播放同一个文件你会直观地听到采样率对声音的影响 —— 22050 会变成低沉的慢放效果88200 会变成尖锐的快进效果5.3 格式转换# WAV 转 MP3指定码率 320kbpsffmpeg-iinput.wav-c:alibmp3lame-b:a320k output.mp3# WAV 转 AAC指定码率 192kbpsffmpeg-iinput.wav-c:aaac-b:a192k output.m4a# MP3 转 WAV解码为无压缩 PCMffmpeg-iinput.mp3 output.wav# 提取视频中的音频并转为 MP3ffmpeg-ivideo.mp4-vn-c:alibmp3lame-b:a192k output.mp3# 将音频重采样为 16000Hz 单声道常用于语音识别预处理ffmpeg-iinput.wav-ar16000-ac1output_16k_mono.wav5.4 提取 PCM 原始数据# 从 MP3 中提取 PCMS16LE 格式ffmpeg-iinput.mp3-fs16le-acodecpcm_s16le output.pcm# 从视频中提取 PCM指定采样率和声道ffmpeg-ivideo.mp4-vn-fs16le-ar44100-ac2output.pcm提取的 .pcm 文件是没有文件头的纯原始数据播放时必须手动指定采样率、位深和声道数否则无法正确解析类似第一篇中的 .rgb 原始数据需要指定分辨率