PCM数据解析

PCM音频数据转WAV

tips: 本文主要介绍pcm和wav音频的数据格式,以及pcm音频数据转wav的方法

目录

  • 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

你可能感兴趣的:(工具是如何产生的,pcm,python,pyqt,视频编解码,音视频)