音视频修炼之基础理论(二):音频

📅 2026/8/8 10:24:49
音视频修炼之基础理论(二):音频
音频基础理论 —— 采样率 / 位深 / 声道 / 响度 / 分贝视频篇讲完再讲音频。这一篇把音频领域的基础概念讲清楚声音怎么变成数字采样定理、采样率为啥是 44.1kHz、位深越多越好吗、分贝的对数玄学、响度 LUFS 的科学。本文速览章节阅读重点0. 声音的本质把握本节核心概念和使用场景1. 采样率Sample Rate把握本节核心概念和使用场景2. 位深Bit Depth把握本节核心概念和使用场景3. 声道Channels把握本节核心概念和使用场景4. 分贝Decibel, dB把握本节核心概念和使用场景5. 响度Loudness—— 现代音频的科学把握本节核心概念和使用场景6. PCM —— 原始音频数据把握本节核心概念和使用场景7. 主流编码格式对比按场景做技术取舍8. 数字音频处理的几个关键概念把握本节核心概念和使用场景9. 数字音频信号示例对照代码和运行效果落地后续章节余下 2 节继续按“概念 → 示例 → 坑点 → 总结”展开0. 声音的本质最终在内存里是一串数字每个数字对应那一瞬间空气压力多大。后面所有概念都是在描述这串数字怎么才能既忠实地还原原始声波、又不占太多空间。1. 采样率Sample Rate1.1 含义采样率 每秒采样多少次单位 Hz。例如44100 Hz 44.1 kHz表示每秒采 44100 个样本。1.2 常见采样率采样率用途8 kHz电话窄带语音16 kHz通话 / 语音识别22.05 kHz老 Web 音频44.1 kHzCD 标准 ⭐48 kHz视频音轨标准 ⭐96 kHz高保真录音192 kHz录音棚 / 极致 Hi-Fi1.3 为什么是 44.1 kHz序号要点1人耳能听20 Hz – 20 kHz2采样定理要求采样率 ≥ 信号最高频率 × 2所以至少 40 kHz3留出滤波器过渡带余量得继续抬高4加上电视行业历史CCIR 标准最终定 44.1 kHz48 kHz 是后来视频行业为了同步定的所以电影、视频、Android 系统都用 48 kHz。1.4 采样率不够会怎样采样率太低 →高频被混叠aliasing→ 镲片声变浑、高音变奇怪。听个对比# 把 44.1k 降到 8k 听听ffmpeg-imusic.mp3-ar8000phone.mp3# 听上去像电话听筒里的音乐1.5 重采样// FFmpeg 重采样 (44.1k → 48k)SwrContext*swrswr_alloc();av_opt_set_int(swr,in_sample_rate,44100,0);av_opt_set_int(swr,out_sample_rate,48000,0);swr_init(swr);swr_convert(swr,...);参考第 5.2 篇 swresample。2. 位深Bit Depth2.1 含义位深 每个样本用多少位bits表示。位深越高 → 动态范围越大 → 暗处细节越多。位深取值范围级数备注8 bit-128 ~ 127256老电话16 bit-32768 ~ 3276765536CD 标准 ⭐24 bit±8,388,6071700 万录音棚32 bit float±1.0无限精度中间处理2.2 动态范围dB经验公式位深 N → 动态范围 ≈ 6N dB。16 bit ≈96 dBCD 标准24 bit ≈144 dB录音棚人耳能感受动态范围约 120 dB耳语 ↔ 钢琴 ↔ 摇滚演唱会。16 bit 96 dB 不够但加了 dithering 后听感够用——这是 CD 选 16 bit 的关键考量。2.3 位深不够会怎样位深越低 → 量化级越粗 → 误差越大 → 听到的底噪越明显。8 bit 只有 256 级16 bit 有 65536 级——后者每级精细 256 倍。2.4 实战选择用途位深电话8 bit (μ-law)通话 / 语音16 bit ⭐音乐播放16 bit录音 / 后期24 bit内部计算32 bit float播放时基本都是 16 bit S16写到 AudioTrack 的就是它。3. 声道Channels3.1 常见声道布局声道数名字喇叭分布典型场景1MonoM单电话 / AM 广播2Stereo⭐L / R大多数音乐3—L / C / R前 3 路影院前置65.1FL / FR / C / LFE / BL / BR家庭影院 ⭐87.15.1 后两侧高端家庭影院LFE Low Frequency Effect重低音通道所以叫 5.1。3.2 数据排列Interleaved vs PlanarInterleaved交错—— 每个时间点的所有声道连续放如LRLRLRLR...。最常见跟硬件接口对齐AudioTrack / WAV / OpenSL ESPlanar平面—— 每个声道一段连续如LLLLLL...RRRRRR...。FFmpeg 内部用这个AVFrameSIMD 友好3.3 PCM 数据大小怎么算这就是为啥 CD 容量定 800 MB——不是技术限制是被16 bit / 44.1kHz / 立体声 / 80 分钟这套规格反推出来的。4. 分贝Decibel, dB4.1 dB 不是单位是比值功率比: dB 10 × log10(P1/P2) 幅度比: dB 20 × log10(A1/A2)几个常用换算dB 变化功率变化幅度变化3 dB×2×1.46 dB×4×210 dB×10×3.1620 dB×100×10分贝是对数刻度符合人耳感知人耳对响度感知就是对数的。4.2 dBFSFull Scale数字音频专用单位相对最大可能值的 dBdBFS含义0 dBFS满刻度再大就削波-6 dBFS一半幅度-20 dBFS1/10 幅度0 dBFS 是上限往下走都是负数。4.3 为什么我们说音量加 6 dB调音量时用 dB 而不是百分比符合人耳感知项说明3 dB人耳几乎听不出6 dB幅度翻倍“明显大一点”10 dB“明显大声”4.4 削波Clipping超过 0 dBFS →数字爆音削顶表现是失真 / “破音”。录音和混音时留 -3 ~ -6 dBFS headroom避免削波。5. 响度Loudness—— 现代音频的科学5.1 为什么需要响度传统只看peak峰值容易把“数字最大值”和“人耳听起来多大声”混为一谈问题peak 的局限更合理的指标短促爆音peak 很高但持续时间短听感不一定大声看一段时间内的综合听感语音 / 音乐差异相同 peak 下语音和音乐的主观响度可能差很多按人耳频响和能量积分评估平台播放一致性只控 peak 会导致不同视频忽大忽小用统一响度目标做归一化结论现代音频不能只问“有没有超过峰值”还要问“人耳听起来到底多响”。5.2 LUFSLoudness Units relative to Full Scale⭐ITU-R BS.1770 标准已经成为业界统一响度算法可以按 3 步理解步骤计算动作直觉解释1K-weighting人耳频响加权人耳对不同频段敏感度不同先按听感修正2计算短期均方功率看一段时间内的能量而不是某一个采样点3转成LUFS得到相对满刻度的“听感响度”单位LUFS 的核心它反映的是人耳感知的响度不是峰值也不是纸面振幅。5.3 各平台响度标准平台目标 LUFSYouTube / Apple Music-14 LUFS⭐Spotify / Tidal / Amazon Music-14 LUFSTikTok / 抖音-14 LUFSNetflix-27 LUFS节目/ -24 LUFS对话广播电视EBU R128-23 LUFS上传超过这个目标 → 平台自动调小低于目标 → 平台调大。5.4 FFmpeg 响度归一化用途命令一遍归一化速度快ffmpeg -i input.mp3 -af loudnormI-14:TP-1:LRA11 output.mp3两遍归一化精确先分析后处理ffmpeg -i input.mp3 -af loudnormI-14:TP-1:LRA11:print_formatjson -f null -参考第 5.1 篇命令 §2.20。6. PCM —— 原始音频数据6.1 PCM 是什么PCMPulse Code Modulation 原始未压缩的数字音频就是一串数字直接表示声波样本。6.2 描述一段 PCM 必须告诉 4 件事一段 raw PCM 没有“自描述能力”必须额外说明 4 个参数参数示例少了会怎样采样率44100 Hz/48000 Hz播放速度和音高都会错位深16 bit/24 bit/float样本解析错可能全是噪声声道数stereo 2 channels单声道 / 立体声 / 5.1 会被读错排列方式interleaved/planar多声道顺序错左右声道或环绕声混乱少一项就解析不了。WAV header 本质上就是给 PCM 附上的这份说明书。6.3 WAV 文件 WAV header PCM 数据WAV 文件 PCM 一份 44 字节的说明书。没了说明书一段 raw PCM 你都不知道用啥采样率播。6.4 PCM 跟 AAC / MP3 的关系格式本质典型体积适合场景PCM未压缩原始采样1 分钟约10 MB处理、混音、播放前的中间数据AAC / MP3有损压缩码流1 分钟约1 MB存储、传输、在线播放方向链路说明播放AAC/MP3 → 解码 → PCM → AudioTrack 播放播放设备最终吃的是 PCM录音PCM → AAC 编码 → 写文件采集到原始 PCM 后再压缩保存PCM 是所有音频处理的中间表达——FFmpeg / WebRTC / Audio APM 都基于 PCM 处理。6.5 为什么音频能从 10 MB 压到 1 MBPCM 1 分钟 ≈ 10 MBAAC / Opus 1 分钟 ≈ 1 MB——10 倍压缩而听感几乎一样。怎么做到的因为人耳没我们想得那么敏锐音频里有4 大冗余可以消除冗余原理消除手段频域不可听人耳听不到 20 Hz 和 20 kHz滤波砍掉听不到的频段听觉掩蔽⭐强声盖住附近弱声心理声学模型MP3 / AAC / Opus 核心时域相关性相邻样本接近波形连续变化LPC 线性预测只编差值FLAC / ADPCM 原理统计冗余样本值分布严重偏斜0 附近最多熵编码Huffman / 算术编码听觉掩蔽是最值钱的——MP3 当年从 PCM 压到 1/10 全靠它。具体例子鼓声爆响那一瞬间你听不到背景的轻微嗡嗡声编码器就敢把那段嗡嗡声编 0 比特人耳完全察觉不到。编码跟 PCM 比主要靠MP3压到 ~10%听觉掩蔽 熵编码AAC压到 ~10%心理声学模型更精细相同码率画质更好Opus压到 ~5%心理声学 神经网络辅助CELT SILK 双模式FLAC压到 ~50%无损只用时域预测 熵编码不用掩蔽7. 主流编码格式对比格式压缩率用途备注AAC中视频音轨 ⭐默认推荐MP3中老格式兼容性好Opus高RTC / 直播 ⭐现代低延迟FLAC无损高保真文件大ALAC无损Apple 生态—Vorbis中老开源OGG 容器AMR高通话语音8kHz 单声道WAV无压缩中间格式大参考 MediaCodec 系列第 4 篇。8. 数字音频处理的几个关键概念8.1 帧Framevs 包Packet⚠️音频里的帧和视频里的帧概念不同单位视频音频frame1 张完整图像1 个采样点含所有声道例1080p 一帧 ≈ 3 MBYUV44.1kHz stereo 16bit 一 frame 4 字节packet1 个 NAL 单元1 段编码后的数据AAC 通常 1024 samples8.2 缓冲区大小场景推荐 buffer理由电话 / 通话10-20ms低延迟优先音乐播放100-300ms稳定不易 underrun录音~100ms够用太小→ 容易 underrun断流太大→ 延迟高。8.3 重采样 / 重声道常见 4 种转换操作算法备注重采样如 44.1 kHz → 48 kHz多相滤波polyphase跨平台音频对齐必备质量取决于滤波器抽头数stereo → mono下混(L R) / 2单声道场景节省一半数据mono → stereo上混R L复制简单 memcpy没增加信息5.1 → stereodownmix矩阵线性组合典型公式L FL 0.707·C 0.707·BLR FR 0.707·C 0.707·BRLFE 一般丢弃FFmpeg 里全都走swresample参考第 5.2 篇swr_alloc_set_opts2(swr,out_chlayout,AV_SAMPLE_FMT_S16,48000,// 目标in_chlayout,AV_SAMPLE_FMT_FLT,44100,// 源0,NULL);swr_init(swr);swr_convert(swr,out_buf,out_samples,in_buf,in_samples);一个函数同时处理重采样 重声道 格式转换不要自己写。9. 数字音频信号示例9.1 一段 1kHz 正弦波importnumpyasnp sample_rate44100duration1.0# 秒tnp.linspace(0,duration,int(sample_rate*duration))samplesnp.sin(2*np.pi*1000*t)# 1kHzsamples_int16(samples*32767).astype(np.int16)samples_int16.tofile(1khz.pcm)# 播放ffplay-fs16le-ar44100-ac11khz.pcm听上去就是嘀——一声。9.2 加噪音noisenp.random.normal(0,0.05,len(samples))noisysamplesnoise听上去就是嘀——声里带沙沙的底噪。9.3 音量归一化normalizepeaknp.max(np.abs(samples))normalizedsamples/peak*0.95# 留 5% headroom把音量拉到 -0.45 dBFS接近满但不削波。10. 常见坑10.1 采样率不匹配PCM 文件实际是 44.1k解码器以为是 48k → 播放速度变慢、音调变低。✅ 写文件头的采样率一定要跟实际匹配。10.2 位深字节序标识含义S16LELittle-endian 小端x86 / ARM 默认S16BEBig-endian 大端x86 / ARM 都是小端但跨平台传输如网络协议要注意。10.3 浮点 vs 整数// FFmpeg 内部用 FLT (32 bit float, -1.0 ~ 1.0)// AudioTrack 要 S16 (16 bit int, -32768 ~ 32767)// 转换:int16_ts(int16_t)(flt*32767);少做这一步 → 全是噪音。10.4 声道顺序错声道布局正确顺序 / 约定错了会怎样StereoL 在前R 在后左右声道互换空间感反了5.1按布局区分前置 / 中置 / LFE / 环绕中置、人声、重低音、环绕声可能全部错位✅ FFmpeg 用channel_layout标识声道布局跨设备更容易保持一致。10.5 音量归一化错位音量归一化要先分清目标防削波看峰值听感一致看响度。把这两个目标混在一起就会出现“峰值正常但听起来忽大忽小”的问题。做法关注指标适合解决什么问题 / 注意❌只按 peak 归一化最大采样点幅度例如max(abs(samples))防止单个采样点超过0 dBFS后削波音乐里有零星爆音时整体音量会被一起压低听感不一定一致✅按 LUFS 响度归一化人耳感知响度例如I-14 LUFS让不同歌曲 / 视频听起来音量接近需要同时限制 true peak避免归一化后重新削波场景推荐策略只想避免爆音 / 削波做 peak 或 true peak 限制要让用户听起来音量一致用 LUFS 归一化例如 FFmpegloudnormI-14上线到短视频 / 音乐平台LUFS 归一化 true peak 限制一起做11. 总结音频基础概念全景3 个最重要的认知认知一句话解释实战意义44.1 kHz / 48 kHz 是行业约定44.1 kHz 来自 CD48 kHz 是视频音轨主流音视频工程里经常要做 44.1 kHz ↔ 48 kHz 重采样dB 是对数刻度6 dB约等于幅度翻倍0 dBFS是数字满刻度上限调音量、判断削波、看音频日志时不能按线性直觉理解LUFS 是现代响度标准LUFS 更接近人耳听感平台常用 -14 LUFS 左右做归一化只看 peak 不够做内容发布 / 播放器音量一致性时要看 LUFS金句音频比视频看起来简单——一串数字而已。但人耳挑剔1ms 卡顿能感知分贝差 3 就听出来。这就是音频处理永远比视频更精细的原因。