物理的声音数据
音调
由声波的频率决定,频率越高,音调越高;频率越低,音调越低。
- “振动次数”指一次完整的往复运动,即一个完整周期。
- 单位:赫兹 (Hz),1 Hz = 1 次/秒。
声响
由声波的振幅决定,振幅越大,能量越多,人耳感觉越响;振幅越小,越轻。
- 单位:分贝 (dB)。
音色
由声波的波形决定,体现声源的独特“指纹”。
计算机的音频数据
样本点
一个连续的声波(例如一个正在演奏的乐队发出的声音)会被转化成一系列的样本点(一个时间上离散的信号),计算机只可以处理这些离散的样本块。
- 在 Web端 每个样本点都是一个 代表着该音频流在特定时间特定声道上的数值的 单精度浮点数。
帧
一个帧,或者一个采样帧是由一组在特定时间上的所有声道的样本点组成的——即所有声道在同一时间的样本点(立体声有 2 个,5.1有 6 个,等等,每个帧包含的样本点个数和声道数相同)。
采样率
采样率就是一秒钟内获取帧的个数。
奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率必须大于或等于模拟信号最高频率的两倍。
-
单位 Hz(或 kHz),常见值:44 100 Hz(CD 音质)、48 000 Hz(专业音频)。
-
一般采用率需要最少是声调的两倍,一次声波震动,最少要记住最高点和最低点,这样才能记录足够多的数据。
-
采样率越高,生产的音频图波形越圆滑。
只需用帧的数目除以采样率即可得到播放时间(单位为秒)。
用样本点数目除以声道个数即可得到帧的数目。
采样大小(位深)
每次采样记录的量化精度,用多少个二进制位来表示瞬时振幅。
比如:16bit 所表示的数据返回是 [2**-15,2**15]
-
常见值:16 bit(CD)、24 bit(高清录音)。
-
位深越大,采样数据精度越大,动态范围越宽,噪声越小。
声道
同时记录的独立音频信号数量。
- 1 = 单声道(Mono),2 = 双声道/立体声(Stereo)。
- 声道数量遇到,音频音质更大,但是音频大小也会倍数增长。
位速(码率 / 比特率)
每秒存储或传输的总数据量。
- 单位 bit/s(或 kbps、Mbps)。
- 计算:位速 = 采样率 × 采样大小 × 声道数 例:44 100 Hz × 16 bit × 2 ch ≈ 1 411 kbps(CD 立体声)。
脉冲编码调制PCM
在自然界中,声音是连续不断的,是一种模拟信号,那怎么才能把声音保存下来呢?那就是声音数字化,既转换为数字信号。
我们知道声音是一种波,有自己的振幅和频率,那么要保存声音,就要保存声音在各个时间点上的振幅。而数字信号并不能连续保持所有时间点上振幅,事实上,并不需要保存连续保持所有时间点上振幅,就可以还原人耳可以接受的声音。
奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率必须大于或等于模拟信号最高频率的两倍。
生成 PCM 音频数据的过程
- 采样:按照固定时间间隔(采样周期)对模拟音频信号进行测量,将连续时间的模拟音频信号转换为离散时间点的信号。
- 量化:将采样得到的连续幅度值转换为有限个离散数值,离散数值采用了位深作为量化数值参考。
- 编码:将量化后的离散数值转换为二进制数字序列,属于无损编码,不压缩原始数据,是 CD、WAV 等高质量音频格式的底层技术,最终输出纯二进制的 PCM 数字音频数据(如
10010110 01101001...)。
模拟信号通过 采用->量化->编码 流程生成数字信号,帮我生成一份图,介绍这个过程
PCM 音频数据内容
未经压缩的原始音频数字信号,只记录瞬时振幅,不压缩、不编码。
- 单声道:采样点按时间顺序依次排列。
- 多声道(如立体声):各声道采样值 交叉(interleaved)存放,小端字节序: 例:L R L R …
| 位宽 | 每采样字节 | 典型类型 | 数值区间 | 备注 |
|---|---|---|---|---|
| 8 bit | 1 | UInt8 | 0‒255 | 无符号 |
| 16 bit | 2 | Int16 | –32 768‒+32 767 | 小端 |
| 24 bit | 3 | Int24 | –8 388 608‒+8 388 607 | 需对齐 |
| 32 bit | 4 | Int32 | –2 147 483 648‒+2 147 483 647 | 小端 |
| 32 bit Float | 4 | Float32 | –1.0‒+1.0(实际裁剪区) | Web 麦克风常用 |
Web 端麦克风 API 返回的
Float32Array即 32-bit IEEE-754 浮点 PCM,每个采样 4 字节,值域 [-1.0, 1.0]。
音频数据处理流程
核心流程:编码定义规则→压缩执行缩减
数字音频处理的核心逻辑是 “先由编码定规则,再按规则做压缩”,两者针对 PCM 原始数据(模拟信号采样后的二进制数据)协同工作,最终输出可优化的音频流,再经封装形成可用文件。
编码:针对 PCM 数据,定义 “标识 + 压缩” 双规则
编码的处理对象是PCM 原始数据,核心作用是为后续处理制定 “可识别、可压缩” 的标准,具体包含两部分:
- 定义数据标识:明确音频的基础属性(采样率、位深、通道数),比如标注 “44.1kHz 采样率、16bit 位深”,让设备能识别 “这是何种规格的音频数据”;
- 内置压缩逻辑:规定 “如何压缩 PCM 数据” 的算法标准,比如:
- 若为 FLAC 编码(无损方向),则内置 “用‘基准值 + 差值’优化重复采样点” 的压缩逻辑;
- 若为 MP3 编码(有损方向),则内置 “过滤超高频段、识别掩蔽效应,同时结合差值计算优化数据” 的压缩逻辑。
压缩:遵循编码规则,缩减 PCM 数据体积
压缩的处理对象仍是PCM 数据,但需严格按照编码定义的压缩逻辑执行,核心是 “在规则框架内减小数据量”,分两类场景:
- 无损压缩(如 FLAC 编码对应的压缩):按编码内置的 “差值算法”,将 PCM 中连续重复的采样点(如 “10010100、10010101、10010102”)转化为 “基准值 + 差值”(如 “基准 10010100,+1、+2”),通过差值计算优化数据表达,不删除任何音频内容;
- 有损压缩(如 MP3 编码对应的压缩):按编码内置的 “感知冗余去除 + 差值计算优化” 逻辑,一方面删除 PCM 中人类听不到的超高频段(>20kHz)、被强音掩盖的弱音细节,主动舍弃非关键内容;另一方面也会对保留的有效数据,通过差值计算进一步优化数据表达,以大幅减小体积。
关键概念:FLAC、MP3 是 “编码 + 压缩” 的统称
日常所说的 “FLAC 格式”“MP3 格式”,并非单一环节,而是 “编码规则 + 对应压缩算法” 的整体代称:
- FLAC:既包含 “定义无损压缩逻辑 + 数据标识” 的编码规则,也包含 “按差值算法压缩 PCM” 的压缩过程,本质是 “无损编码 + 无损压缩” 的结合体;
- MP3:既包含 “定义有损压缩逻辑 + 数据标识” 的编码规则,也包含 “按感知冗余去除算法压缩 PCM” 的压缩过程,本质是 “有损编码 + 有损压缩” 的结合体。
补充:与封装的衔接(完整流程闭环)
编码 + 压缩处理后,会生成 “结构化的压缩音频流”(如 FLAC 音频流、MP3 音频流),此时需通过封装环节:
- 将单一音频流(或搭配视频流、字幕流)按统一容器规则(如 MP4、MKV、FLAC 文件格式)打包;
- 添加索引信息(如播放时间戳、文件标识),最终形成可存储、可播放的完整文件(如
.flac.mp3.mp4)。
文件音频格式
WAV 音频格式
WAV 音频格式的别名 WAVE,是经典的Windows音频数据封装格式,由Microsoft开发。数据本身格式为PCM,也可以支持一些编码格式的数据,比如最近流行的AAC编码。如果是PCM,则为无损格式,文件会比较大,并且大小相对固定,可以使用以下公式计算文件大小。
FileSize(文件大小) = HeadSize(文件头部长度) + TimeInSecond(音频时长) * SampleRate(采样率) * Channels(声道数量) * BitsPerSample(的位深) / 8
| 字段名 | 偏移(字节) | 长度(字节) | 字节序 | 描述 |
|---|---|---|---|---|
| ChunkID | 0(0x00-0x03) | 4 | 大端 | 资源交换文件标识符,通常为 "RIFF" |
| ChunkSize | 4(0x04-0x07) | 4 | 小端 | 即从下一个地址开始,到文件末尾的总字节数,即文件总字节数-8;从第8位开始一直到文件末尾,都是ID为RIFF块的内容,其中会包含两个子块,fmt和data |
| Format | 8(0x08-0x0B) | 4 | 大端 | wav文件标志,通常为 WAVE |
| Subchunk1ID | 12(0x0C-0x0F) | 4 | 大端 | 波形格式标志,通常为 fmt,注意最后有空格,因为要补齐4个字节 |
| Subchunk1Size | 16(0x10-0x13) | 4 | 小端 | 过滤字节,也就是 fmt 块的内容所占字节数,即 16 |
| AudioFormat | 20(0x14-0x15) | 2 | 小端 | 格式类别,1表示PCM形式采样数据 |
| NumChannels | 22(0x16-0x17) | 2 | 小端 | 声道数 |
| SampleRate | 24(0x18-0x1B) | 4 | 小端 | 采样率 |
| ByteRate | 28(0x1C-0x1F) | 4 | 小端 | 波特率,即声道数 × 采样频率 × 采样位数 / 8 |
| BlockAlign | 32(0x20-0x21) | 2 | 小端 | 传输速率,声道数 × 采样位数 / 8 |
| BitsPerSample | 34(0x22-0x23) | 2 | 小端 | 位深 |
| Subchunk2ID | 36(0x24-0x27) | 4 | 大端 | 数据标识符,通常为data |
| Subchunk2Size | 40(0x28-0x2B) | 4 | 小端 | data块内容所占字节数,即数据总大小-44 |
| Data | 44(0x2C-eos) | 可变 | 小端 | 实际PCM音频样本数据 |
上表为典型的WAV头部格式,从0x00到0x2B总共44字节,从0x2C开始一直到文件末尾都是PCM音频数据。所以如果你已经知道了PCM的采样信息,那么可以直接跳过头部的解析,直接从0x2C开始读取PCM即可,但是对于另一些无损的WAV文件却是不行的。
例题
- 一个单声道和一个立体声的音频片段,每个都是 1 秒钟,播放频率(采样率)为 44100 赫兹。
单声道片段会有 44100 个样本点和 44100 个帧。长度属性为 44100。
立体声片段会有 88200 个样本点和 44100 个帧。长度属性依旧为 44100,因为长度总和帧的个数相同。
- 采样频率 44100 Hz,采样精度16 bit,单声道,采集3 分钟,文件大小是多少MB。
44100 * 16 * 3 * 60 = 127008000 bit
2116800 / 8 / 1024 / 1024 ≈ 15.141M