python 从wav文件中提取pcm数据

python 电子创客营 95次浏览 已收录 扫描二维码

目的很简单,我要从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字符:可以详细看我另一篇文章:http://www.eemaker.com/python-bytes-ascii.html  这个问题解决了就没有什么障碍了。下面看下代码:

'''
--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

转载请注明转自电子创客营:python 从wav文件中提取pcm数据! 了解我们点击这里
喜欢 (0)or分享 (0)
电子创客营
关于作者: