html5 video ffmpeg h.264 webm

html5 - Codificación de FFMPEG en MPEG-DASH(o WebM con clústeres de fotogramas clave) para la API MediaSource



video h.264 (4)

Actualmente estoy enviando un flujo de video a Chrome para reproducirlo a través de la API MediaSource.

Según tengo entendido, MediaSource solo admite archivos MP4 codificados con archivos MPEG-DASH o WebM que tienen grupos que comienzan con fotogramas clave (de lo contrario, genera el error: el segmento de medios no comenzó con el fotograma clave).

¿Hay alguna forma de codificar en formato MPEG-DASH o WebM de fotogramas clave con FFMPEG en tiempo real?

Editar:

Lo probé con ffmpeg ... -f webm -vcodec vp8 -g 1 para que cada fotograma sea un fotograma clave. No es la solución ideal. Aunque ahora funciona con MediaStream. ¿Alguna forma de sincronizar los segmentos con los fotogramas clave en WebM para que no todos los fotogramas tengan que ser un fotograma clave?

Preguntas de referencia sobre WebM / MP4 y MediaSource:

Media Source Api no funciona para un archivo webm personalizado (Chrome versión 23.0.1271.97 m)

MediaSource API y mp4


En este momento, FFMPEG no admite la codificación DASH. Puede segmentar con FFMPEG ( https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment ), pero recomiendo combinar FFMPEG y MP4Box. Use FFMPEG para transcodificar su video en vivo, y luego MP4Box para segmentar y crear el índice .mpd.

MP4Box es una parte de GPAC ( http://gpac.wp.mines-telecom.fr/ ).

Aquí hay un ejemplo usando h264:

ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"

Si necesita VP8 (WebM), use: -vcodec libvpx y -f webm o -f ts .


Me encontré con la misma situación al intentar reproducir de nuevo el archivo .webm grabado por la API MediaRecorder utilizando Media Source Extensions (MSE). Las grabaciones de Chrome (51) están mal formadas, Firefox (46) parece estar bien.

Para que funcione, tienes que arreglar cues en el archivo .webm:

  1. clone https://github.com/webmproject/libwebm
  2. asegúrese de tener la versión cmake> = 3.2 ( https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04 )
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. ¡cargue fix.webm en DASH / su propio reproductor!

Espero que haya ayudado a alguien. Fue bastante difícil buscar información en Google sin la palabra clave DASH (no estoy usando DASH, solo la misma tecnología subyacente - MSE) :)



Para asegurarse de que cada clúster en su WebM comience con un fotograma clave, intente algo como esto:

ffmpeg / [...inputs] / -vcodec libvpx / -keyint_min 60 / -g 60 / -vb 4000k / -f webm / -cluster_size_limit 10M / -cluster_time_limit 2100 / [...output]

Básicamente, como se implementó, cada fotograma clave debe estar al principio de un clúster pero el inverso no es cierto. Es decir, en el fotograma clave habrá un nuevo clúster, pero en el nuevo clúster no necesariamente habrá un fotograma clave. Para solucionar este problema, simplemente configuramos el tamaño del clúster a algo grande que nunca alcanzaremos.

En este ejemplo, tendremos un fotograma clave cada 2 segundos, y el límite de tiempo del clúster es de 2.1 segundos, por lo que nunca lo alcanzaremos. La tasa de bits es de 4 Mbit, y el límite de tamaño del clúster es de 10M-algo. No estoy seguro de si hay bits o bytes, pero no importa, ya que nunca lo haremos, ya que lo he establecido mucho más de lo que debe ser.