Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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

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]);

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

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 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 objetos VideoReader de su área de trabajo, utilice la función clear.

  • 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 un 1 lógico (true) cuando el valor de la propiedad CurrentTime sea igual al valor de la propiedad Duration. 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 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. 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é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