example apple ios ffmpeg avfoundation hls http-live-streaming fmp4

apple - Transcodificación de fMP4 a HLS mientras escribe en iOS usando FFmpeg



encoder hls (1)

Estrictamente hablando, no necesita transcodificar el fmp4 si contiene h264 + aac, solo necesita reempaquetar los datos de muestra como TS. (usando ffmpeg -codec copy o gpac )

Wrt. alineación (1.2) Supongo que todo esto depende de la configuración de su codificador (frecuencia de cuadros, frecuencia de muestreo y tamaño de GOP). Ciertamente es posible asegurarse de que el audio y el video se alineen exactamente en los límites de los fragmentos (ver, por ejemplo, esta tabla ). Si está apuntando a iOS, recomendaría usar el protocolo HLS versión 3 (o 4) que permita que el tiempo se represente con mayor precisión. Esto también le permite transmitir audio y video por separado (no multiplexado).

Creo que ffmpeg debería ser capaz de impulsar una transmisión fmp4 en vivo (es decir, utilizando una POST HTTP de larga duración), pero la reproducción requiere que el software de origen haga algo significativo con ella (es decir, transmitir a HLS).

TL; DR

Quiero convertir fragmentos fMP4 en segmentos TS (para HLS) ya que los fragmentos se escriben usando FFmpeg en un dispositivo iOS.

¿Por qué?

Estoy tratando de lograr la carga en vivo en iOS mientras mantengo una copia HD sin problemas localmente.

Lo que he intentado

  1. Rodando AVAssetWriter s donde cada uno escribe durante 8 segundos, luego concatenando los MP4 juntos a través de FFmpeg.

    Lo que salió mal : a veces hay fallas en el audio y el video. He identificado 3 razones para esto.

    1) Fotogramas de cebado para audio escrito por el codificador AAC creando huecos.

    2) Dado que los cuadros de video tienen 33.33 ms de largo y los cuadros de audio de 0.022 ms de largo, es posible que no se alineen al final de un archivo.

    3) La falta de codificación precisa de cuadros está presente en Mac OS, pero no está disponible para iOS Detalles aquí

  2. FFmpeg mezclando un archivo MP4 de solo video grande con audio sin procesar en segmentos TS. El trabajo se basó en el Kickflip SDK

    Lo que salió mal : de vez en cuando se cargaba un archivo de solo audio, sin ningún tipo de video. Nunca pude reproducirlo internamente, pero fue bastante molesto para nuestros usuarios cuando no registraron lo que pensaban que hicieron. También hubo problemas con la búsqueda precisa en los segmentos finales, casi como si los segmentos TS estuvieran marcados incorrectamente en el tiempo.

Lo que estoy pensando ahora

Apple empujó fMP4 en WWDC este año (2016) y no lo había investigado mucho antes de eso. Dado que un archivo fMP4 puede leerse y reproducirse mientras se está escribiendo, pensé que sería posible que FFmpeg transcodifique el archivo tal como se está escribiendo, siempre y cuando no enviemos los bytes a FFmpeg hasta que cada fragmento dentro El archivo está terminado.

Sin embargo, no estoy lo suficientemente familiarizado con la API de FFmpeg C, solo la usé brevemente en el intento n. ° 2.

Lo que necesito de ti

  1. ¿Es esta una solución factible? ¿Alguien está lo suficientemente familiarizado con fMP4 para saber si realmente puedo lograr esto?
  2. ¿Cómo sabré que AVFoundation ha terminado de escribir un fragmento dentro del archivo para poder canalizarlo en FFmpeg?
  3. ¿Cómo puedo tomar datos de un archivo en el disco, trocearlo a la vez, pasarlo a FFmpeg y escupir segmentos TS?