PCM数据解析

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 bytesChunkIDRIFF
4 bytesChunkSize余下数据字节数大小
4 bytesFormatWAVE
4 bytesSubchunk1IDfmt
4 bytesSubchunk1Size16 for PCM
2 bytesAudioFormat编码格式,PCM = 1
2 bytesNumChannels声道数,Mono = 1, Stereo = 2, etc.
4 bytesSampleRate采样率
4 bytesByteRate播放器每秒需要转换的字节数, ==SampleRate * NumChannels * BitsPerSample/8
2 bytesBlockAilgn块对齐,== NumChannels * BitsPerSample/8
2 bytesBitsPerSample采样位深,8 bits = 8, 16 bits = 16, etc.
4 bytesSubchunk2IDdata
4 bytesSubchunk2Size音频数据的大小(字节),== NumSamples * NumChannels * BitsPerSample/8
n bytesdata音频数据

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值