python 从wav文件中提取pcm数据
目的很简单,我要从wav文件里面提取出来一段纯音频数据变成c语言数组的形式,最后烧录进我的设备中用来播放声音。本来还想自己查资料把wav文件的格式整个摸一遍,但是一搜python库还是有写好的,又省下一下午时间。
首先通过终端 pip install wave 安装一下python的wave库。下面我们就可以借用wave库直接对wav文件操作,下面这几个函数是可能用到的:
- f=wave.open(“filename”,’rb’) 打开一个wav文件
- params=f.getparams() 这个函数可以返回 wav文件的参数:声道数、位数、采样频率、采样点数、压缩类型、压缩类型描述 。其中需要注意如果返回的压缩类型不为none的话,wave库是不支持的要确保你的wav文件是没有加过压缩算法的
- f.readframes(len) 读取len长度的采样点数据,返回的是bytes类型数据,(这里还有个坑,后面会讲)
- f.rewind() 将文件指针回滚到音频流开头
- f.setpos() 将文件指针设定位置
- f.tell() 返回当前文件指针
实际应用中最常用的也就前三个函数,通过这几个函数我们很容易就可以从wav文件里面读取出来bytes类型的pcm音频原数据。但是要把bytes先准换成字符串的时候里面会既包含十六进制的格式还有ascii字符:可以详细看我另一篇文章:https://www.eemaker.com/python-bytes-ascii.html 这个问题解决了就没有什么障碍了。下面看下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
''' --wav.py --write by derrick --从wav文件中提取出来pcm格式数据生成c数组形式 --20180829 ''' from sys import argv import wave fileName=argv[1] #form argv get wave file name f=wave.open(fileName,'rb') params=f.getparams() #get wave file params print("wav params is :",params) #open a txt file fData=open("wavData.txt",'w') for i in range (4000): #read 3000*16 bytes data=f.readframes(16) ldata=list(data) sdata=str(ldata) # sdata=sdata.replace('\\x',',') fData.writelines(sdata[1:-1]) #去掉开头和结尾的无关符号 fData.write(",\n") #添加逗号和换行 f.close() #close wave file fData.close() #close data file |