import wave
import numpy as np
import simpleaudio as sa
project_path = "/home/amazing/python/sound"
music_file_path = project_path+"/data/3.wav"
if __name__ == '__main__':
#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(music_file_path, "rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
print(params)
# _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=9109296, comptype='NONE', compname='not compressed')
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
sound_buffer = f.readframes(nframes)
f.close()
# #将波形数据转换成数组
# #需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.frombuffer(sound_buffer, dtype=np.int16)
print(np.shape(wave_data))
# (64644,)
# #将wave_data数组改为2列, 声道数是2,所以改为2
wave_data = wave_data.reshape((-1, 2))
print(np.shape(wave_data))
#转置数据
wave_data = wave_data.T
# print(np.shape(wave_data))
# (2, 32322)
left_channel_sound_data = wave_data[0]
right_channel_sound_data = wave_data[1]
play_obj = sa.play_buffer(sound_buffer, nchannels, sampwidth, framerate)
# play_obj = sa.play_buffer(left_channel_sound_data.tobytes(), 1, sampwidth, framerate)
# play_obj = sa.play_buffer(right_channel_sound_data.tobytes(), 1, sampwidth, framerate)
play_obj.wait_done()