PCM和WAV音频格式的区别

发布于:2025-07-03 ⋅ 阅读:(21) ⋅ 点赞:(0)

        

目录

一、pcm和wav区别

1. 本质区别

2. 文件结构与元数据

3. 兼容性与使用场景

4. 文件大小

5. 相互转换

总结

二、wav文件头详解 

1. WAV 文件整体结构

2. RIFF 文件头(12字节)

3. fmt 子块(24字节或更大)

4. data 子块(音频数据)

5. 其他可选块

6. 完整WAV文件示例(44字节最小文件)

7. 如何解析WAV文件头?

总结


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)结构,主要包含以下部分:

  1. RIFF 文件头(12字节)

  2. fmt 子块(24或更多字节,描述音频格式)

  3. data 子块(存储音频数据)

  4. 可选的其他块(如 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文件头?

  1. 读取前4字节,确认是 "RIFF"

  2. 读取 ChunkSize,计算文件总大小。

  3. 检查 Format 是否为 "WAVE"

  4. 找到 "fmt " 块,解析音频参数(采样率、位深等)。

  5. 定位 "data" 块,读取音频数据。


总结

  • WAV文件头是 RIFF结构的容器,包含 fmt(格式描述)和 data(音频数据)两个核心块。

  • PCM WAV 的 fmt 块固定为16字节,AudioFormat = 1

  • 解析时需注意字节序(小端序,Intel格式)。

如果需要生成或修改WAV文件,可通过编程(如Python的wave模块、C/C++文件操作)直接读写这些字段。

 


网站公告

今日签到

点亮在社区的每一天
去签到