Leer archivos de vídeo
Este ejemplo muestra cómo leer los fotogramas de un vídeo a partir de un tiempo o índice de fotograma específico, leer los fotogramas de un intervalo específico o leer todos los fotogramas del vídeo.
Leer fotogramas a partir de un tiempo o índice de fotograma específico
Lea parte de un archivo de vídeo a partir de los 0,5 segundos después del comienzo del archivo. Después, lea el vídeo a partir del índice de fotograma 100 hasta el final del archivo de vídeo.
Cree un objeto VideoReader
para el archivo de vídeo de muestra xylophone_video.mp4
.
vidObj = VideoReader("xylophone_video.mp4");
Especifique que la lectura debe comenzar 0,5 segundos después del comienzo del archivo estableciendo la propiedad CurrentTime
.
vidObj.CurrentTime = 0.5;
Lea los fotogramas del vídeo hasta el final del archivo mediante el método readFrame
.
while hasFrame(vidObj) vidFrame = readFrame(vidObj); imshow(vidFrame) pause(1/vidObj.FrameRate) end
De forma alternativa, puede leer los fotogramas de un vídeo a partir de un índice de fotograma específico hasta el final del vídeo mediante el método read
. Especifique los índices para leer como [100 Inf]
. El método read
devuelve todos los fotogramas que van desde el 100 hasta el final del archivo de vídeo.
vidframes = read(vidObj,[100 Inf]);
Borre el objeto VideoReader
.
clear vidObj
Leer los fotogramas de un intervalo específico
Lea una parte de un archivo de vídeo especificando el intervalo de tiempo o fotograma.
Lea los fotogramas del vídeo que se encuentren entre los 0,6 y los 0,9 segundos. En primer lugar, cree un objeto VideoReader
y un arreglo de estructuras para albergar los fotogramas.
vidObj = VideoReader("xylophone_video.mp4"); s = struct("cdata",zeros(vidObj.Height,vidObj.Width,3,"uint8"),colormap=[]);
Después, especifique que la lectura debe comenzar 0,6 segundos después del comienzo del archivo estableciendo la propiedad CurrentTime
.
vidObj.CurrentTime = 0.6;
Lea un fotograma cada vez hasta que CurrentTime
llegue a 0,9 segundos. Añada datos de cada fotograma de vídeo al arreglo de estructura. Consulte el número de fotogramas en el arreglo de estructuras. s
es un arreglo de estructuras de 1 por 10 que indica que se han leído 10 fotogramas. Para obtener información sobre la visualización de los fotogramas en el arreglo de estructuras s
como un vídeo, consulte la página de referencia de la función movie
.
k = 1; while vidObj.CurrentTime <= 0.9 s(k).cdata = readFrame(vidObj); k = k+1; end whos s
Name Size Bytes Class Attributes s 1x10 2305344 struct
De forma alternativa, puede leer todos los fotogramas de un intervalo específico mediante índices de fotograma. Por ejemplo, especifique el rango de fotogramas para leer como [18 27]
. El método read
devuelve un arreglo de m por n por p por 10 (en el que cada fotograma tiene un tamaño de m por n por p), lo que indica que se han leído 10 fotogramas.
frames = read(vidObj,[18 27]);
whos frames
Name Size Bytes Class Attributes frames 240x320x3x10 2304000 uint8
Borre el objeto VideoReader
.
clear vidObj
Leer todos los fotogramas
Lea todos los fotogramas del vídeo, un fotograma cada vez o todos los fotogramas a la vez.
Cree un objeto VideoReader
y muestre el número total de fotogramas del vídeo.
vidObj = VideoReader("xylophone_video.mp4");
vidObj.NumFrames
ans = 141
Lea todos los fotogramas, de uno en uno, mediante el método readFrame
y muestre los fotogramas.
while hasFrame(vidObj) frame = readFrame(vidObj); imshow(frame) pause(1/vidObj.FrameRate) end
De forma alternativa, puede leer todos los fotogramas del vídeo a la vez. El método read
devuelve un arreglo de m por n por p por 141 (en el que cada fotograma tiene un tamaño de m por n por p) de fotogramas del vídeo.
allFrames = read(vidObj);
whos allFrames
Name Size Bytes Class Attributes allFrames 240x320x3x141 32486400 uint8
Borre el objeto VideoReader
.
clear vidObj
Resolución de problemas y consejos para la lectura de vídeos
En plataformas Windows®, no puede modificar ni eliminar el archivo AVI al que se hace referencia en un objeto
VideoReader
de su área de trabajo. Para eliminar los objetosVideoReader
de su área de trabajo, utilice la funciónclear
.Para algunos archivos MP4, la propiedad
NumFrames
puede devolver diferentes valores en plataformas Windows, Mac y Linux®. Esta variación es el resultado de las diferencias en las API específicas de cada plataforma.El método
hasFrame
puede devolver un1
lógico (true
) cuando el valor de la propiedadCurrentTime
sea igual al valor de la propiedadDuration
. Este comportamiento se debe a una limitación en las API subyacentes utilizadas específicas de cada plataforma.No se recomienda la búsqueda del último fotograma de un archivo de vídeo estableciendo la propiedad
CurrentTime
en un valor cercano al valor deDuration
. En algunos archivos, esta operación devuelve un error que indica que se ha alcanzado el final del archivo, incluso aunque el valor deCurrentTime
sea inferior al valor deDuration
. Este problema suele ocurrir si la duración del archivo es mayor que la duración de la secuencia de vídeo y no hay ningún vídeo disponible para leer cerca del final del archivo.No se recomienda utilizar la propiedad
Duration
para limitar la lectura de datos de un archivo de vídeo. Utilice el métodohasFrame
para comprobar si hay fotogramas disponibles para leer. Es mejor leer datos hasta que el archivo informe de que no hay más fotogramas disponibles para leer.Rendimiento de la lectura de vídeos en sistemas Windows: Para conseguir un mejor rendimiento del lector de vídeo en Windows para archivos
MP4
yMOV
, MATLAB® utiliza el hardware gráfico del sistema para la descodificación. Sin embargo, en algunos casos, usar la tarjeta gráfica para descodificar puede ocasionar un peor rendimiento en función del hardware gráfico específico del sistema. Si observa un rendimiento más lento del lector de vídeo en el sistema, deshabilite la aceleración del hardware escribiendo:matlab.video.read.UseHardwareAcceleration('off')
. Puede volver a habilitar la aceleración del hardware escribiendo:matlab.video.read.UseHardwareAcceleration('on')
.
Consulte también
VideoReader
| mmfileinfo
| movie
| read
| readFrame