目录
PCM(脉冲编码调制)和 WAV(Waveform Audio File Format)是音频领域中常见的两种格式,它们的核心区别在于PCM是一种原始的音频数据编码方式,而WAV是一种文件容器格式,可以封装PCM或其他编码的音频数据。以下是详细对比:
一、pcm和wav区别
1. 本质区别
PCM(脉冲编码调制)
原始音频数据:直接记录声音的数字化样本,未压缩,保真度高。
无文件结构:只有连续的二进制音频数据流,不包含元数据(如采样率、声道数等),需额外指定参数才能播放。
用途:常用于音频实时传输、专业音频处理或嵌入式系统。
WAV(波形音频文件格式)
文件容器:基于RIFF标准,是一种包含音频数据和元数据的文件格式。
通常封装PCM:WAV文件最常存储PCM数据,但也支持其他编码(如ADPCM、MP3等)。
包含元数据:文件头中会明确标注采样率、位深、声道数等信息,无需额外配置即可播放。
2. 文件结构与元数据
PCM
只有纯音频数据流,无文件头。
播放时需要手动指定参数(如44.1kHz采样率、16位深、立体声)。
WAV
包含标准的RIFF文件头,结构如下:
text
[文件头] [格式块] [数据块]
文件头中明确存储音频格式、采样率、位深、声道数、数据大小等信息。
3. 兼容性与使用场景
PCM
优点:低延迟,适合实时音频处理(如电话系统、录音设备)。
缺点:缺乏元数据,通用性差,需依赖外部信息解析。
WAV
优点:标准化格式,兼容所有播放器和编辑软件(如Audacity、Windows Media Player)。
缺点:若存储PCM数据,文件体积较大(与PCM原始数据相同),但可通过压缩编码减小体积(如使用ADPCM)。
4. 文件大小
若WAV文件存储的是PCM数据,则两者体积几乎相同(WAV仅多几十字节的文件头)。
但WAV也支持压缩编码(如MP3),此时文件会比原始PCM小,但会损失音质。
5. 相互转换
PCM → WAV:添加WAV文件头(指定采样率、位深等参数即可)。
WAV → PCM:剥离WAV文件头,提取纯音频数据流。
总结
特性 | PCM | WAV(PCM编码时) |
---|---|---|
本质 | 原始音频数据 | 包含PCM的容器格式 |
元数据 | 无 | 有(采样率、声道数等) |
压缩 | 无压缩 | 通常无压缩(但支持压缩编码) |
播放 | 需手动配置参数 | 直接兼容所有播放器 |
体积 | 纯数据大小 | 数据大小 + 文件头(可忽略) |
选择建议:
需要无损音频编辑或专业处理时,用PCM或WAV(PCM封装)。
需要通用播放或存储时,用WAV。
若对体积敏感,可选用WAV+压缩编码(如ADPCM)。
二、wav文件头详解
WAV(Waveform Audio File Format)是一种基于 RIFF(Resource Interchange File Format) 结构的音频文件格式,其文件头包含了音频数据的详细描述信息。以下是 WAV 文件头的详细解析,包括结构、字段含义及示例。
1. WAV 文件整体结构
WAV 文件采用 RIFF 分块(Chunk)结构,主要包含以下部分:
RIFF 文件头(12字节)
fmt 子块(24或更多字节,描述音频格式)
data 子块(存储音频数据)
可选的其他块(如 LIST 块存储元数据)
text
| RIFF WAVE Chunk | |-----------------| | fmt Subchunk | |-----------------| | data Subchunk | |-----------------| | (Optional) LIST | | ... |
2. RIFF 文件头(12字节)
偏移量 | 字段名 | 大小(字节) | 数据类型 | 说明 |
---|---|---|---|---|
0 | ChunkID | 4 | char[4] | 固定为 "RIFF" (0x52 0x49 0x46 0x46) |
4 | ChunkSize | 4 | uint32 | 整个文件大小 - 8(即 文件总字节数 - (ChunkID + ChunkSize) ) |
8 | Format | 4 | char[4] | 固定为 "WAVE" (0x57 0x41 0x56 0x45) |
示例(十六进制):
text
52 49 46 46 RIFF 24 00 00 00 ChunkSize = 36(文件总大小 = 36 + 8 = 44字节) 57 41 56 45 WAVE
3. fmt 子块(24字节或更大)
描述音频的格式信息,标准PCM格式通常为16字节,但扩展格式可能更大(如含扩展信息)。
偏移量 | 字段名 | 大小(字节) | 数据类型 | 说明 |
---|---|---|---|---|
12 | Subchunk1ID | 4 | char[4] | 固定为 "fmt " (0x66 0x6D 0x74 0x20) |
16 | Subchunk1Size | 4 | uint32 | fmt块大小(PCM通常为16,非PCM可能更大) |
20 | AudioFormat | 2 | uint16 | 编码格式:1 = PCM,3 = IEEE Float,6 = ADPCM,其他为压缩格式 |
22 | NumChannels | 2 | uint16 | 声道数(1 = 单声道,2 = 立体声,6 = 5.1声道等) |
24 | SampleRate | 4 | uint32 | 采样率(Hz,如44100) |
28 | ByteRate | 4 | uint32 | 每秒字节数 = SampleRate * NumChannels * BitsPerSample/8 |
32 | BlockAlign | 2 | uint16 | 每个样本的字节数 = NumChannels * BitsPerSample/8 |
34 | BitsPerSample | 2 | uint16 | 位深度(8、16、24、32等) |
36 | (扩展信息) | 可选 | - | 非PCM格式可能有额外字段(如扩展大小、附加参数) |
示例(44.1kHz 立体声 16位 PCM):
text
66 6D 74 20 "fmt " 10 00 00 00 Subchunk1Size = 16 01 00 AudioFormat = 1(PCM) 02 00 NumChannels = 2(立体声) 44 AC 00 00 SampleRate = 44100(0x0000AC44) 10 B1 02 00 ByteRate = 44100×2×16/8 = 176400(0x0002B110) 04 00 BlockAlign = 2×16/8 = 4 10 00 BitsPerSample = 16
4. data 子块(音频数据)
存储实际的音频采样数据,格式由 fmt
块定义。
偏移量 | 字段名 | 大小(字节) | 数据类型 | 说明 |
---|---|---|---|---|
36 | Subchunk2ID | 4 | char[4] | 固定为 "data" (0x64 0x61 0x74 0x61) |
40 | Subchunk2Size | 4 | uint32 | 音频数据大小(字节数) |
44 | Data | N | byte[] | 音频数据(PCM样本按声道交替存储,如立体声:L R L R...) |
示例:
text
64 61 74 61 "data" 00 00 00 00 Subchunk2Size(需根据实际数据填写) [音频数据...]
5. 其他可选块
LIST 块:存储元数据(如作者、版权信息)。
fact 块:非PCM格式必需,记录样本总数。
cue 块:标记音频中的关键点。
6. 完整WAV文件示例(44字节最小文件)
text
52 49 46 46 RIFF 24 00 00 00 ChunkSize = 36 57 41 56 45 WAVE 66 6D 74 20 fmt 10 00 00 00 Subchunk1Size = 16 01 00 AudioFormat = PCM 02 00 NumChannels = 2 44 AC 00 00 SampleRate = 44100 10 B1 02 00 ByteRate = 176400 04 00 BlockAlign = 4 10 00 BitsPerSample = 16 64 61 74 61 data 00 00 00 00 Subchunk2Size = 0(无数据)
7. 如何解析WAV文件头?
读取前4字节,确认是
"RIFF"
。读取
ChunkSize
,计算文件总大小。检查
Format
是否为"WAVE"
。找到
"fmt "
块,解析音频参数(采样率、位深等)。定位
"data"
块,读取音频数据。
总结
WAV文件头是 RIFF结构的容器,包含
fmt
(格式描述)和data
(音频数据)两个核心块。PCM WAV 的
fmt
块固定为16字节,AudioFormat = 1
。解析时需注意字节序(小端序,Intel格式)。
如果需要生成或修改WAV文件,可通过编程(如Python的wave
模块、C/C++文件操作)直接读写这些字段。