Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Leer archivos de vídeo

Lea todos los fotogramas de vídeo, fotogramas a partir de una hora especificada o fotogramas dentro de un intervalo de tiempo especificado.

Leer todos los fotogramas en archivo de vídeo

En este ejemplo se muestra cómo leer y almacenar datos de todos los fotogramas de un archivo de vídeo, mostrar un fotograma y, a continuación, reproducir todos los fotogramas a la velocidad de fotogramas del vídeo.

Construya un objeto asociado con el archivo de ejemplo,.VideoReaderxylophone.mp4

vidObj = VideoReader('xylophone.mp4');

Determine la altura y la anchura de los fotogramas.

vidHeight = vidObj.Height; vidWidth = vidObj.Width;

Cree una matriz de estructura de película,.MATLAB®s

s = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...     'colormap',[]);

Lea un fotograma a la vez utilizando hasta que se alcance el final del archivo.readFrame Anexar datos de cada fotograma de vídeo a la matriz de estructura.

k = 1; while hasFrame(vidObj)     s(k).cdata = readFrame(vidObj);     k = k+1; end

Obtener información sobre la matriz de la estructura de película,.s

whos s
  Name      Size                Bytes  Class     Attributes    s         1x141            32503552  struct   

es una matriz de estructura de 1 por 141, que contiene datos de los 141 fotogramas del archivo de vídeo.s

Visualice el quinto fotograma almacenado.s

image(s(5).cdata)

Cambie el tamaño de la figura y los ejes actuales en función del ancho y el alto del vídeo. A continuación, reproduzca la película una vez a la velocidad de fotogramas del vídeo utilizando la función.movie

set(gcf,'position',[150 150 vidObj.Width vidObj.Height]); set(gca,'units','pixels'); set(gca,'position',[0 0 vidObj.Width vidObj.Height]); movie(s,1,vidObj.FrameRate);

Cierre la figura.

close

Leer todos los fotogramas comenzando en el tiempo especificado

Leer parte de un archivo de vídeo a partir de 0,5 segundo desde el principio del archivo.

Construya un objeto asociado con el archivo de ejemplo,.VideoReader'xylophone.mp4'

vidObj = VideoReader('xylophone.mp4'); 

Especifique que la lectura debe comenzar 0,5 segundos desde el principio del archivo estableciendo la propiedad.CurrentTime

vidObj.CurrentTime = 0.5; 

Cree un eje para mostrar el vídeo. A continuación, lea los fotogramas de vídeo hasta que se alcance el final del archivo.

currAxes = axes; while hasFrame(vidObj)     vidFrame = readFrame(vidObj);     image(vidFrame, 'Parent', currAxes);     currAxes.Visible = 'off';     pause(1/vidObj.FrameRate); end 

Leer fotogramas de vídeo dentro del intervalo de tiempo especificado

Leer parte de un archivo de vídeo de 0,6 a 0,9 segundo.

Construya un objeto asociado con el archivo de ejemplo,.VideoReader'xylophone.mp4'

vidObj = VideoReader('xylophone.mp4'); 

Cree una matriz de estructura de película de MATLAB®,.s

s = struct('cdata',zeros(vidObj.Height,vidObj.Width,3,'uint8'),...     'colormap',[]); 

Especifique que la lectura debe comenzar 0,6 segundos desde el principio del archivo estableciendo la propiedad.CurrentTime

vidObj.CurrentTime = 0.6; 

Lea un fotograma a la vez hasta que llegue a 0,9 segundos.CurrentTime Anexar datos de cada fotograma de vídeo a la matriz de estructura,.s

k = 1; while vidObj.CurrentTime <= 0.9     s(k).cdata = readFrame(vidObj);     k = k+1; end 

Ver el número de fotogramas en.s

whos s 
  Name      Size              Bytes  Class     Attributes    s         1x10            2305432  struct                

es una estructura de 1 por 10 que muestra que se leyeron 10 fotogramas.s

Ver la propiedad del objeto.CurrentTimeVideoReader

vidObj.CurrentTime 
 ans =      0.9333  

La propiedad es ahora mayor que.CurrentTime0.9

Solución de problemas

No se puede leer el último fotograma del archivo de vídeo:

  • El método puede devolver Logical (true) cuando el valor de la propiedad es igual al valor de la propiedad.hasFrame1CurrentTimeDuration Esto se debe a una limitación en las API subyacentes utilizadas.

  • Evite buscar el último fotograma de un archivo de vídeo estableciendo la propiedad en un valor cercano al valor.CurrentTimeDuration Para algunos archivos, esta operación devuelve un error que indica que se ha alcanzado el final de archivo, aunque el valor es menor que el valor.CurrentTimeDuration 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 utilice la propiedad para limitar la lectura de datos de un archivo de vídeo.Duration Es mejor leer los datos hasta que el archivo informe que no hay más fotogramas disponibles para leer. Es decir, utilice el método para comprobar si hay un marco disponible para leer.hasFrame

Rendimiento de lectura de vídeo en sistemas:Windows®

  • Para lograr un mejor rendimiento del lector de vídeo en for y files, utiliza el hardware de gráficos del sistema para la decodificación.WindowsMP4MOVMATLAB Sin embargo, en algunos casos el uso de la tarjeta gráfica para la decodificación puede resultar en un rendimiento más pobre en función del hardware de gráficos específico en el sistema. Si observa un rendimiento del lector de vídeo más lento en su sistema, desactive la aceleración de hardware escribiendo:

    matlab.video.read.UseHardwareAcceleration('off')

    La aceleración de hardware se puede volver a habilitar escribiendo:

    matlab.video.read.UseHardwareAcceleration('on')

Consulte también

| |

Temas relacionados