PCM音频数据转WAV
tips: 本文主要介绍pcm和wav音频的数据格式,以及pcm音频数据转wav的方法
目录
PCM数据解析
PCM数据为左声道4字节右声道4字节的储存方式储存数据
+-----+-----+-----+-----+-----+-----+
L | R | L | R | L | R |
+-----+-----+-----+-----+-----+-----+
|32bit|32bit|32bit|32bit|32bit|32bit|
- 数据解读方式
| 低位<<------------高位|从右往左
| 8bit| 8bit| 8bit| 8bit|
+-----+-----+-----+-----+
12 | 34 | 56 | 78 |
+-----+-----+-----+-----+
| |从左往右:高位--->低位
WAV数据解析
wav数据格式为44字节头文件信息,剩下的数据为音频数据
| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit| 8bit|
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
R I F F | 余下数据字节数大小 | W A V E | f m t |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
16 for pcm | 编码格式 | 声道数 | 采样率 |播放器每秒需要转换的字节数|
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
BlockAilgn | 采样位深 | d a t a | 音频数据的大小(字节) | left data |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
right data | left data | right data |......
tips: 音频时长 = 余下字节数大小 / 播放器每秒需要转换的字节数
- wav文件格式
size | 内容 | 含义 |
---|---|---|
4 bytes | ChunkID | RIFF |
4 bytes | ChunkSize | 余下数据字节数大小 |
4 bytes | Format | WAVE |
4 bytes | Subchunk1ID | fmt |
4 bytes | Subchunk1Size | 16 for PCM |
2 bytes | AudioFormat | 编码格式,PCM = 1 |
2 bytes | NumChannels | 声道数,Mono = 1, Stereo = 2, etc. |
4 bytes | SampleRate | 采样率 |
4 bytes | ByteRate | 播放器每秒需要转换的字节数, ==SampleRate * NumChannels * BitsPerSample/8 |
2 bytes | BlockAilgn | 块对齐,== NumChannels * BitsPerSample/8 |
2 bytes | BitsPerSample | 采样位深,8 bits = 8, 16 bits = 16, etc. |
4 bytes | Subchunk2ID | data |
4 bytes | Subchunk2Size | 音频数据的大小(字节),== NumSamples * NumChannels * BitsPerSample/8 |
n bytes | data | 音频数据 |
PCM转WAV
了解了pcm和wav数据的格式后,可以发现pcm转wav其实只需要加上wav文件格式开始的44个字节头文件信息即可。python有一个wave库可以很方便的添加格式头, 示例代码如下:
def pcm2wav(pcm_file, wav_output_file, channels = 2, bits = 16, sample_rate = 48000):
pcmFile = open(pcm_file, 'rb')
pcmdata = pcmFile.read()
pcmFile.close()
if bits % 8 != 0:
raise ValueError("bits % 8 must == 0. now bits is:" + str(bits))
wavFile = wave.open(wav_output_file, 'wb')
#设置输出通道数
wavFile.setnchannels(channels)
#设置输出采样深度
wavFile.setsampwidth(bits // 8)
#设置采样频率
wavFile.setframerate(sample_rate)
#写入pcm数据
wavFile.writeframes(pcmdata)
wavFile.close
完整的代码仓库地址:https://github.com/scavenger-caesar/pcm2wav
windows二进制文件下载地址:https://download.csdn.net/download/weixin_46027271/88713937?spm=1001.2014.3001.5501