大家好,我用Python写了个用线程同时录制系统音频和麦克风输入的代码,运行时有时候可以正常执行,有时候就报错,不知道原因,请教各位大神!
使用的是PyCharm,解释器python 3.9,PyAudio版本0.2.11
具体代码如下:
import threading import wave from pyaudio import PyAudio, paInt16
framerate=160000 #采样率 NUM_SAMPLES=4000 #采样点4000 channels=1 #一个声道 sampwidth=2 #两个字节十六位 global my_buf my_buf = [] lock=threading.Lock() def save_wave_file(filename, data): #save the date to the wav file wf = wave.open(filename, 'wb') #二进制写入模式 wf.setnchannels(channels) wf.setsampwidth(sampwidth) #两个字节16位 wf.setframerate(framerate) #帧速率 wf.writeframes(b"".join(data)) #把数据加进去,就会存到硬盘上去 wf.writeframes(b"".join(data)) wf.close()
def my_record1(): pa1= PyAudio() for i in range(100): #循环100次 lock.acquire() stream1 = pa1.open(format=paInt16, channels=1, rate=framerate, input=True, input_device_index=1,frames_per_buffer=NUM_SAMPLES) string_audio_data1 = stream1.read(NUM_SAMPLES) # 录系统音频,每读完4000个采样加1 my_buf.append(string_audio_data1) lock.release() print(1) def my_record2(): pa2= PyAudio() for i in range(100): #循环100次 lock.acquire() stream2 = pa2.open(format=paInt16, channels=1, rate=framerate, input=True, input_device_index=2,frames_per_buffer=NUM_SAMPLES) string_audio_data2 = stream2.read(NUM_SAMPLES) # 录麦克风,每读完2000个采样加1 my_buf.append(string_audio_data2) lock.release() print(2) threads = [] t2 = threading.Thread(target=my_record2,args=()) threads.append(t2) t1 = threading.Thread(target=my_record1,args=()) threads.append(t1)
if __name__ == '__main__': for t in threads: t.setDaemon(True) t.start() for t in threads: t.join() save_wave_file('03.wav', my_buf) # 文件保存 print('录音结束!')