Arreglando fotogramas clave del contenedor de video para transmisión en vivo

Arreglando fotogramas clave del contenedor de video para transmisión en vivo

tengo unTarjeta de capturaque es manejado porun programaque tengo la intención de ejecutar en una Raspberry Pi 3 (lo compilé) para transmitir video localmente a un Chromecast. Este programa se ejecuta y envía datos de vídeo a la salida estándar en un contenedor MPEG-TS con códecs H.264 y AAC.

Escribí un script que básicamente segmenta esto para servir una transmisión HLS/m3u8:

./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8

Esto funciona bien en casi cualquier reproductor de video, excepto en Chrome (cast) que se niega a reproducir la transmisión. CORS está configurado correctamente.

Durante la depuración usando chrome://media-internalsel siguiente mensaje aparece constantemente:

Los metadatos del contenedor ISO-BMFF para fotogramas de vídeo indican que el fotograma es un fotograma clave, pero el contenido del fotograma de vídeo indica lo contrario.

Investigando esto más a fondo me encontré con el hecho de queChrome es más estricto sobre cómo reproducir formatos de vídeo.

Siguendoloesta respuesta, extraer la transmisión H.264 y remixarla en un archivo resolvió el problema, lo que hizo que Chrome y Chromecast estuvieran felices de reproducir la transmisión. Lo probé usando una tubería ( cat fixed-recording.mp4 | ffmpeg -i - ...) solo para asegurarme de que no fuera un problema.

¿Hay alguna manera de arreglar los fotogramas clave del contenedor con ffmpeg sobre la marcha? Necesito ejecutar esto en un RPi 3, lo que significa que no podré volver a codificar el video y prefiero no escribir archivos grandes en el disco. Esto es lo que probé:

  • Uso -movflags empty_moov+default_base_moof+frag_keyframey combinación de ellos (de StackOverflow).
  • En su lugar, utilice una transmisión MP4 fragmentada.
  • Se extrajeron las secuencias sin procesar en dos archivos, pero falló porque ambos archivos deben escribirse constantemente.

información relacionada