.png)
He leído algunas respuestas y artículos sobre el uso de programas como VLC
, MPlayer
, ffmpeg
, etc., pero ninguno de los métodos que he visto es "sin pérdidas". No capturan cada fotograma. Quiero extraer cada cuadro de un video como una imagen (100% de calidad, no quiero perder ningún detalle), por lo que, en teoría, se podrían tomar esas imágenes y recrear el archivo de video sin poder notar la diferencia. el original (excluyendo la falta de audio, por supuesto).
Puntos de bonificación si puedo especificar una hora de inicio y finalización para capturar fotogramas, de modo que no tenga que recortar el archivo de vídeo de antemano.
Respuesta1
Puede extraer los fotogramas como PNG, un formato de compresión de imágenes sin pérdidas. Por ejemplo, para extraer fotogramas de la marca de 5 minutos a la marca de 10 minutos:
ffmpeg -ss 05:00 -i <input> -t 05:00 filename%05d.png
Respuesta2
Existen varias herramientas que deberían poder extraer todos los fotogramas de un archivo de película:
avconv
avconv -i file.avi -f image2 Out%00d.jpg
ffmpeg
ffmpeg -i input.file thumb%04d.png -hide_banner
Esto también puede exportar BMP, que requiere mucho menos tiempo de procesamiento que PNG o JPG.
También hay un script bash llamadomov2frame.shque intenta automatizar el proceso de extracción de FFMPEG.
Reproductor de MP3
mplayer -ao null -vo png input.file
u otra opción:
mplayer -nosound -vo png:z=9 my_file.mp4
VLC Aparentemente, este reproductor multimedia puede exportar conjuntos de imágenes usando sus filtros, pero parece problemático a menos que sea su único uso o tenga una versión portátil.
Cree una carpeta para almacenar sus marcos y copie la ruta a ella. Para usuarios de Mac OSX/Linux, esta debe ser la ruta completa (sin ~).
Haga clic en Herramientas/Preferencias en VLC.
En "mostrar configuración", haga clic en "todos".
En "Video", seleccione "Filtros". Marque "Filtro de vídeo de escena".
Expanda "Filtros" y seleccione "Filtro de escena",
Pegue la ruta anterior en "prefijo de ruta del directorio".
Elija la fracción de fotogramas a codificar en el cuadro "proporción de grabación". 1/12 con salida cada 12, 1/1 los exportará todos
Clic en Guardar".
Haga clic en Medios/Abrir vídeo y busque su vídeo. Pacientemente deja que todo funcione.
Haga clic en Herramientas/Preferencias. En "mostrar configuración", haga clic en "todos". En "vídeo", seleccione "filtros". Desmarque "Filtro de vídeo de escena". Clic en Guardar". Esto es para que VLC no genere miniaturas la próxima vez que reproduzcas un vídeo. enlace
También parece haber algunos problemas potenciales con los permisos de administrador en la primera ejecución del programa:
sudo vlc [sudo] password for mint16: VLC is not supposed to be run as root. Sorry. If you need to use real-time priorities and/or privileged TCP ports you can use vlc-wrapper (make sure it is Set-UID root and cannot be run by non-trusted users first).
VLC también funciona mucho mejor al extraer a BMP en lugar de PNG
Respuesta3
Al hacer esto con ffmpeg, descubrí que a menudo necesito usar la -vsync 0
opción (por ejemplo, cuando trabajo con algunos archivos VOB de DVD):
ffmpeg -i video.VOB -vsync 0 %06d.bmp
Si también desea establecer una hora de inicio y finalización, se vería así:
ffmpeg -i video.VOB -vsync 0 -ss 01:30 -to 01:40 %06d.bmp
Respuesta4
A continuación se muestra el código en opencv que me funcionó para extraer cuadros de video.
import cv2
import os
# Replace 'your_video_file.mp4' with the path to your video file
video_path = 'your_video_file.mp4'
# Create a VideoCapture object
cap = cv2.VideoCapture(video_path)
# Check if the video file is opened successfully
if not cap.isOpened():
print("Error: Could not open video file.")
exit()
# Create a directory to store the frames
output_directory = 'frames'
os.makedirs(output_directory, exist_ok=True)
# Loop to read frames from the video
frame_count = 0
while True:
# Read a frame from the video
ret, frame = cap.read()
# Check if the frame is read successfully
if not ret:
print("End of video.")
break
# Save the frame as an image file
frame_filename = os.path.join(output_directory, f'frame_{frame_count:04d}.png')
cv2.imwrite(frame_filename, frame)
frame_count += 1
# Release the VideoCapture object
cap.release()
print(f"{frame_count} frames saved in '{output_directory}'.")