почему файл записи пуст в python - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь записать экран своего рабочего стола и записать звук с микрофона одновременно с помощью этого python скрипта.

Теперь, когда я запускаю только часть захвата экрана, код работает отлично, но когда я пытаюсь запустить код записи звука и скриншота, как показано ниже. мое видео и аудио оба файла не открываются. (0 байт) или файл очень маленького размера.

Как я могу решить эту проблему.

обновленный код

теперь я могу записывать голос правильно, но видеофайл не открывается?

import datetime
import tkinter as tk
from tkinter import *
from tkinter import ttk ,FLAT
from PIL import Image, ImageTk, ImageGrab
import cv2
import numpy as np
import threading
import win32api
import pyaudio
import wave

VIDEO_SIZE = (800 , 420)  #(960, 540)
p = ImageGrab.grab()
a, b = p.size
chunk = 1024 
sample_format = pyaudio.paInt16 
channels = 2
fs = 44100 
frames = []
g = pyaudio.PyAudio() 
date = datetime.datetime.now()
filename='rec_%s-%s-%s-%s-%s-%s.mp4' % (date.year, date.month, date.day,date.hour, date.minute, date.second)
  #fourcc = cv2.VideoWriter_fourcc(*'XVID')
frame_rate = 24
cap = cv2.VideoCapture(0)
out = cv2.VideoWriter() 
def screen_capturing():

    global capturing
    capturing = True

    while capturing:

        img = ImageGrab.grab()
        frame = np.array(img)
        sc = np.array(img)
        _xs,_ys = win32api.GetCursorPos()
        cv2.circle(frame,(_xs,_ys),20,(255,255,0), 2)
        sc = cv2.resize(sc, VIDEO_SIZE)
        tkimage.paste(Image.fromarray(sc))
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        out.write(frame)
def start_screen_capturing():

    if not out.isOpened():

        out.open(filename, 0x31637661, frame_rate,(VIDEO_SIZE))
    t1=threading.Thread(target=screen_capturing, daemon=True)
    t1.start()

def stop_screen_capturing():
    global capturing
    capturing = False
    out.release()

def voice_recording():
    global recording
    while recording:
        data = stream.read(chunk)
        frames.append(data)

def start_voice_recording():
    global stream 
    stream = g.open(format=sample_format,channels=channels,rate=fs,frames_per_buffer=chunk,input=True)
    global recording
    recording = True
    print('capturing')
    t2 = threading.Thread(target=voice_recording)                # daemon=True
    t2.start()

def stop_voice_recording():
    #global recording

    recording =False 
    print(' complete')
    filename='test'    
    filename = filename+".wav"
    wf = wave.open(filename,'wb')
    wf.setnchannels(channels)
    wf.setsampwidth(g.get_sample_size(sample_format))
    wf.setframerate(fs)
    wf.writeframes(b''.join(frames))
    wf.close()

root = tk.Tk()
root.title('Screen Recorder')
root.geometry('+260+70')

tkimage = ImageTk.PhotoImage(Image.new('RGB', VIDEO_SIZE, (0,0,0)))

w, h = VIDEO_SIZE
vbox = tk.Label(root, image=tkimage, width=w, height=h, bg='black')
vbox.pack(pady=10,padx=25)

frame = tk.Frame(root)
frame.pack()

start_cap = tk.Button(frame, text='Start screen Recording', width=30, command=start_screen_capturing)
start_cap.grid(row=0, column=0)

stop_cap = tk.Button(frame, text='Stop screen Recording', width=30, command=stop_screen_capturing)
stop_cap.grid(row=0, column=1)

start_voice = tk.Button(frame, text='Start voice Recording', width=30, command=start_voice_recording)
start_voice.grid(row=0, column=2)

stop_voice = tk.Button(frame, text='Stop voice Recording', width=30, command=stop_voice_recording)
stop_voice.grid(row=0, column=3)

root.mainloop()
...