Python写了个用线程同时录制系统音频和麦克风输入的代码,运行时有时候可以正常执行,有时候就报错,请问原因?

大家好,我用Python写了个用线程同时录制系统音频和麦克风输入的代码,运行时有时候可以正常执行,有时候就报错,不知道原因,请教各位大神!

使用的是PyCharm,解释器python 3.9,PyAudio版本0.2.11

  • 正常运行时,能看到代码的两个线程分别在运行并打印,也能正常完成文件的录制;
  • 但是经常不能正常运行,报错消息主要有以下两种:
  1. 进程已结束,退出代码-1073741819 (0xC0000005)

具体代码如下:

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('录音结束!')

你可能感兴趣的:(python,实时音视频)