#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 и не пробовал ничего из этого.