Main Content

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

Figure contains an axes object. The axes object contains an object of type image.

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

Figure contains an axes object. The axes object contains an object of type image.

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 un 1 lógico (verdadero) cuando el valor de la propiedad CurrentTime sea igual al valor de la propiedad Duration. 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 de Duration. En algunos archivos, esta operación devuelve un error que indica que se ha alcanzado el final del archivo, incluso aunque el valor de CurrentTime sea inferior al valor de Duration. 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étodo hasFrame 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 y MOV, 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

| | | |

Temas relacionados