使用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')
广告