Leer archivos de vídeo
Lea los fotogramas de un vídeo a partir de un tiempo o índice de fotograma específico, lea los fotogramas de un intervalo específico o lea 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.
Construya un objeto VideoReader
asociado con el archivo de muestra 'xylophone.mp4'
.
vidObj = VideoReader('xylophone.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 llegar al 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]);
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 de lector de vídeo y un arreglo de estructura para albergar los fotogramas.
vidObj = VideoReader('xylophone.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 estructura. s
es una estructura 1 por 10 que indica que se han leído 10 fotogramas. Para obtener información sobre la visualización de los fotogramas en la estructura s
como una película, 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 segundo argumento de read
como [18 27]
. El método read
devuelve un arreglo FrameSize
por 10 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
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 de lector de vídeo y muestre el número total de fotogramas del vídeo.
vidObj = VideoReader('xylophone.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 FrameSize
por 141 de fotogramas del vídeo.
allFrames = read(vidObj);
whos allFrames
Name Size Bytes Class Attributes allFrames 240x320x3x141 32486400 uint8
Resolución de problemas y consejos para la lectura de vídeos
El método
hasFrame
puede devolver un1
lógico (verdadero) cuando el valor de la propiedadCurrentTime
sea igual al valor de la propiedadDuration
. Esto se debe a una limitación de las API subyacentes utilizadas.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
. Esto 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