python--wave库的使用

这是笔记,不定时更新

wave–音频文件操作

wav文件详解

1、wav文件是基于windows平台的音频资源文件,符合RIFF(Resource Interchange File Format)文件规范,标准化的wav文件44.1k采样率,16位数字表示
2、wav文件分为两给部分,第一个部分是wav头文件,第二给部分是PCM编码的音频数据部分;
3、PCM编码:数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse-code modulation),即脉冲编码调制;
4、wav头文件:
RIFF文件由一个简单表头(header)跟随多个“chunks”组成。
wav文件一般由3给区块组成:RIFF chunk、Format chunk、Data chunk和可选区块:Fact chunk、Cue points chunk、Playlist chunk、 Associated data list chunk等

RIFF 区块
名称偏移地址字节数端序内容
ID0x004Byte大端‘RIFF’(0x52494646)
Size0x044Byte小端fileSize-8
Type0x084Byte大端‘WAVE’(0x57415645)
  • ‘RIFF’ 为标识
  • Size是整个文件的长度减去IDSize的长度
  • TypeWAVE表示后面需要两个子块:Format区块和Data区块
FORMAT区块
名称偏移地址字节数端序内容
ID0x004Byte大端‘fmt’(0x666D7420)
Size0x044Byte小端16
AudioFormat0x082Byte小端音频格式
Numchannels0x0A2Byte小端声道数
SampleRate0x0C4Byte小端采样率
ByteRate0x104Byte小端每秒数据字节数
BlockAlign0x142Byte小端数据块对齐
BitsPerSample0x162Byte小端采样位数
  • ‘fmt’ 为标识
  • Size表示该区块数据的长度(不包含IDSzie的长度)
  • AudioFormat 表示Data区块存储的音频数据的格式,PCM音频数据的值为1
  • NumChannels表示音频数据的声道数,1:单声道,2:双声道
  • SampleRate 表示音频数据的采样率
  • ByteRate 每秒数据字节数=SampleRateNumChannelsBitsPerSample/8
  • BlockAlign每个采样所需的字节数=NumChannels*BitsPerSample/8
  • BitsPerSample每个采样存储的bit数,8:8bit,16:16bit,32:32bit
Data区块
名称偏移地址字节数端序内容
ID0x004Byte大端‘data’(0x64617461)
Size0x044Byte小端N
Data0x08NByte小端音频数据
  • ‘data’ 为标识
  • Size表示音频数据的长度,N=ByteRate*seconds
  • Data 音频数据
大小端

wav文件以小端形式来进行数据存储

大端:数据低位保存在内存的高位地址中,而数据高位保存在内存的低位地址中
小端:数据高位保存在内存的低位地址中,而数据高位保存在内存的低位地址中
PCM数据在wav文件中的bit位排列方式

PCM数据类型采样采样
8Bit单声道声道0声道0
8Bit双声道声道0声道1
16Bit单声道声道0低位,声道0高位声道0低位,声道0高位
16Bit双声道声道0低位,声道0高位声道1低位,声道1高位

读取

import wave
import os 
import numpy as np
filePath='xxx.wav'
f=wave.open(filePath,"rb")
params=f.getparams()
nchannels,sampwidth,framerate,nframes,comptype,compname=params
print("nchannels:",nchannels)#通道数
print("sampwidth:",sampwidth)#采样字节长度
print("framerate:",framerate)#采样频率
print("nframes",nframes)#总帧数(数据总长)
print("comptype",comptype)#压缩类型 NONE为AIFF-C
print("compname",compname)#可读的压缩类型

#读取波形数据,返回为bytes对象的n帧
strData=f.readframes(nframes)
f.close()
#波形数据转数组
waveData=np.fromstring(strData,dtype=np.int16)#数据的类型要和sampwidth一致

生成WAV

...数据生成waveDataBytes
waveFile=wave.open(r'xxx.wav','wb')
waveFile.setparams((1,2,10000,wavelen,'NONE','Tsinghua'))
waveFile.writeframes(waveDataBytes)
waveFile.close()

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值