Quiero crear una aplicación web que extraiga cada cuadro de un archivo MP4 y lo guarde como PNG. Establecer el currentTime de un elemento <video> y dibujarlo en un lienzo no funciona, ya que a menudo se saltan algunos cuadros.
Estoy usando el VideoDecoder . Tiene un método de decode , que recibe un EncodedVideoChunk, que contiene una matriz de bytes: un "fragmento de un video".
Analicé este archivo MP4 para obtener "moov" - "trak" - 0 - "mdia" - "minf" - "stbl". Corté una parte del archivo MP4 de stbl.stco[0] , de una longitud stbl.stsz[0] (80 y 42548 en este caso). los bytes son
[0, 0, 0, 2, 9, 16, 0, 0, 166, 42, 37, 136, 128, 67, 255, 235, ...]Todavía veo un mensaje de error:
Failed to execute 'decode' on 'VideoDecoder': A key frame is required after configure() or flush().¿Qué estoy haciendo mal? ¿Cómo puedo encontrar un dato correcto que deba proporcionarse al VideoDecoder?
Todos mis pasos fueron correctos. El problema fue que el VideoDecoder perdió el parámetro de description durante configure() . Parece que ningún archivo MP4 se puede decodificar sin él.
Utilice la secuencia de 40 bytes en stbl.stsd.extraData.avcC como valor de la description .
El error de cuadro clave se refiere al campo EncodedVideoChunk.type , que debe ser "key" al comienzo de la decodificación. Se supone que esta información proviene del contenedor multimedia.
Esto es independiente del formato del flujo de bits; si el flujo de bits es el Anexo B, entonces no debe establecer una description , y si el flujo es AVC (usado en MP4), debe establecer una description .