Как записать аудио с помощью pyaudio в основном цикле while opencv?

#python #opencv #pyaudio

Вопрос:

Я пытаюсь создать приложение для записи экрана с помощью python, записи звука с помощью pyaudio и экрана с помощью open-cv.
Проблема в том, что звук не записывается нормально, он предназначен для записи аудио и видео одинаковой длины (по времени), но аудио длится всего 1 или 2 секунды, в то время как видео намного длиннее.

var возвращает 0 или 1, что говорит о том, хочет пользователь аудио или нет

 # this function actully record screen and audio
def record():
    pop.destroy()
    
    
    for m in get_monitors():
        width = m.width
        height = m.height

    audio = pyaudio.PyAudio()
    stream = audio.open(format = pyaudio.paInt32, channels = 2, rate = 44100, input = True, frames_per_buffer = 1024)
    frames = []

    vid = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    video = cv2.VideoWriter(f'{name}.mp4', vid, 3.5, (width, height))







    while True:

        if int(var.get()):
            data = stream.read(1024)
            frames.append(data)

        img = pyautogui.screenshot()#ImageGrab.grab(bbox = (0, 0, width, height))
        mouseX,mouseY = pyautogui.position()

        img_np = np.array(img)
        img_final = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)

        

        # Synthesize mouse pointer
        Xthis = [2*x mouseX for x in Xs]
        Ythis = [2*y mouseY for y in Ys]

        
        points = list(zip(Xthis,Ythis))
        points = np.array(points, 'int32')
        cv2.fillPoly(img_final,[points],color=[255,255,255])

    


        frame = cv2.resize(img_final,(960,540))
        cv2.imshow('Simple Recorder - Recording Window', frame)


        k = cv2.waitKey(100)
        if k == 27:
            cv2.destroyAllWindows()
            break

        if cv2.getWindowProperty('Simple Recorder - Recording Window',cv2.WND_PROP_VISIBLE) < 1:
            cv2.destroyAllWindows()
            break





    if int(var.get()):
        stream.stop_stream()
        stream.close()
        audio.terminate()

    cv2.destroyAllWindows()
    video.write(img_final)
    sound_file = wave.open(f'{name}.wav', 'wb')
    sound_file.setnchannels(2)
    sound_file.setsampwidth(audio.get_sample_size(pyaudio.paInt32))
    sound_file.setframerate(44100)
    sound_file.writeframes(b''.join(frames))
    sound_file.close()
 

Заранее благодарю вас за ваше драгоценное время и помощь.

Комментарии:

1. Клавиша ожидания(100) будет ждать примерно до 100 миллисекунд. если вам нужно это время, чтобы сделать что-то еще, просто используйте клавишу ожидания(1). о, и, возможно, увеличится frames_per_buffer . 1024 выборки при частоте 44,1 кГц составляют 23 миллисекунды. после этого ваш буфер переполняется, и вы теряете данные. дайте мне знать, если моя догадка верна. Я никогда раньше не использовал pyaudio и не пробовал ничего из этого.