使用Python (wave)读写WAV文件


Python标准库中的wave模块是一个易于使用的音频WAV格式接口。该模块中的函数可以将原始格式的音频数据写入文件对象,并读取WAV文件的属性。

文件以'写入'或'读取'模式打开,就像使用内置的open()函数一样,但是使用wave模块中的open()函数

wave.open()

此函数打开一个文件以读取/写入音频数据。该函数需要两个参数——第一个是文件名,第二个是模式。模式可以是'wb'(写入音频数据)或'rb'(读取)。

obj = wave.open('sound.wav','wb')

'rb'模式返回一个Wave_read对象,而'wb'模式返回一个Wave_write对象。

Wave_write对象具有以下方法:

close()如果文件是由wave打开的,则关闭文件。
setnchannels()设置声道数。1表示单声道,2表示立体声。
setsampwidth()将样本宽度设置为n字节。
setframerate()将帧速率设置为n。
setnframes()将帧数设置为n。
setcomptype()设置压缩类型和描述。目前,只支持NONE压缩类型,这意味着不压缩。
setparams()接受参数元组 (nchannels, sampwidth, framerate, nframes, comptype, compname)
tell()检索文件中当前位置。
writeframesraw()写入音频帧,不进行校正。
writeframes()写入音频帧并确保它们是正确的。

下面的代码创建一个持续时间为99999秒的WAV文件,其中包含随机的短整型字节。

import wave, struct, math, random
sampleRate = 44100.0 # hertz
duration = 1.0 # seconds
frequency = 440.0 # hertz
obj = wave.open('sound.wav','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
   value = random.randint(-32767, 32767)
   data = struct.pack('<h', value)
   obj.writeframesraw( data )
obj.close()

Wave_read对象方法

close()如果流是由wave模块打开的,则关闭流。
getnchannels()返回音频通道数(单声道为1,立体声为2)。
getsampwidth()返回样本宽度(以字节为单位)。
getframerate()返回采样频率。
getnframes()返回音频帧数。
getcomptype()返回压缩类型('NONE'是唯一支持的类型)。
getparams()返回一个namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname),等效于get*()方法的输出。
readframes(n)读取并返回最多n帧音频,作为字节对象。
rewind()将文件指针倒回音频流的开头。

下面的代码读取WAV文件的一些参数。

import wave
obj = wave.open('sound.wav','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

输出

Number of channels 1
Sample width 2
Frame rate. 44100
Number of frames 99999
parameters: _wave_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype='NONE', compname='not compressed')

更新于:2020年6月30日

22K+浏览量

启动你的职业生涯

完成课程后获得认证

开始学习
广告