es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo grabo los últimos 30 segundos en Python?

Tengo este código que graba tu pantalla. Pero quiero grabar lo que sucedió hace unos segundos. por ejemplo, hace 30 segundos. ¿Cómo puedo hacer eso?
Quiero que sea como la función que ocurre cuando presionas la tecla tecla de inicio + alt + g

import pyautogui
import cv2
import numpy as np

resolución = (1920, 1080)
códec = cv2.VideoWriter_fourcc(*"XVID")

nombre_archivo = "Grabación.mp4"

fps = 60.0
out = cv2.VideoWriter(nombre_archivo, códec, fps, resolución)
cv2.namedWindow("En vivo", cv2.WINDOW_NORMAL)
cv2.resizeWindow("En vivo", 480, 270)

while True:
    img = pyautogui.screenshot()

    frame = np.array(img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    out.write(frame)

    cv2.imshow('En vivo', frame)

    if cv2.waitKey(1) == ord('q'):
        break

out.release()
cv2.destroyAllWindows()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para registrar lo que sucedió hace unos segundos, es necesario almacenar los fotogramas en un búfer por un cierto tiempo (por ejemplo, 30 segundos) y luego escribirlos en el video de salida en orden inverso. Aquí hay un ejemplo de cómo se puede modificar el código para lograr esto:

    import pyautogui
    import cv2
    import numpy as np
    import time
    
    resolution = (1920, 1080)
    codec = cv2.VideoWriter_fourcc(*"XVID")
    filename = "Grabación.mp4"
    fps = 60.0
    out = cv2.VideoWriter(filename, codec, fps, resolution)
    cv2.namedWindow("En vivo", cv2.WINDOW_NORMAL)
    cv2.resizeWindow("En vivo", 480, 270)
    
    # Almacenar los fotogramas durante 30 segundos
    buffer_size = int(fps * 30)
    frame_buffer = []
    for i in range(buffer_size):
        frame_buffer.append(None)
    
    while True:
        img = pyautogui.screenshot()
        frame = np.array(img)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
        # Agregar el fotograma al búfer
        frame_buffer.pop(0)
        frame_buffer.append(frame)
    
        # Escribir los fotogramas en el video de salida en orden inverso
        for i in range(buffer_size - 1, -1, -1):
            if frame_buffer[i] is not None:
                out.write(frame_buffer[i])
    
        cv2.imshow('En vivo', frame)
    
        if cv2.waitKey(1) == ord('q'):
            break
    
    out.release()
    cv2.destroyAllWindows()
    

    Este código crea un búfer de fotogramas con un tamaño de 30 segundos * fps, que se llena con valores None al principio. En cada iteración del bucle, se agrega el fotograma actual al final del búfer y se elimina el fotograma más antiguo del principio. Después de eso, los fotogramas en el búfer se escriben en el video de salida en orden inverso, de modo que los fotogramas de hace 30 segundos se escriben primero. Tenga en cuenta que este método requiere mucha memoria si está grabando a una alta resolución y/o velocidad de fotogramas, por lo que es posible que deba disminuir el tamaño del búfer o disminuir la resolución/velocidad de fotogramas.

Comments are closed.