ffmpeg: empaquetar H264@MPEGTS en Smooth Streaming

ffmpeg: empaquetar H264@MPEGTS en Smooth Streaming

Tengo un conjunto (bastante grande) de archivos que es todoH264en unMPEG-TSenvase. Debido a limitaciones de tiempo, necesito volver a empaquetar este contenido en una transmisión fluida sin transcodificarlo (la transcodificación llevaría demasiado tiempo).

He estado tratando de descubrir cómo hacer esto con ffmpeg, ya que parece tener 2 muxers diferentes que podrían ser adecuados para la tarea. Probé tanto el muxer 'smoothstreaming' como el muxer 'ismv', pero con ambos tengo problemas.

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

Con esto me sale el siguiente error:

Versión de ffmpeg N-79695-g675cfb2 Copyright (c) 2000-2016 los desarrolladores de FFmpeg
  construido con gcc 5.3.1 (Debian 5.3.1-14) 20160409
  configuración:
  libavutil 55. 23.100 / 55. 23.100
  libavcodec 57. 38.100 / 57. 38.100
  formato libav 57. 35.100 / 57. 35.100
  dispositivo libav 57. 0.101 / 57. 0.101
  filtro libav 6. 44.100 / 6. 44.100
  escalalibsw 4. 1.100 / 4. 1.100
  bibliotecaswresample 2. 0.101 / 2. 0.101
Entrada #0, mpegs, de 'input.mpg':
  Duración: 01:28:41.98, inicio: 2.040000, tasa de bits: 2500 kb/s
  Programa 1
    Transmisión #0:0[0x1e1]: Vídeo: h264 (Principal) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 tbr, 90k tbn
    Stream #0:1[0x1e2](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, estéreo, s16p, 192 kb/s
[smoothstreaming @ 0x2616340] El uso de AVStream.codec para pasar parámetros de códec a muxers está en desuso; utilice AVStream.codecpar en su lugar.
    Último mensaje repetido 1 veces.
[smoothstreaming @ 0x2616340] No se ha establecido ninguna velocidad de bits para la transmisión 0
Salida #0, transmisión fluida, a 'ss_out':
  Metadatos:
    codificador: Lavf57.35.100
    Transmisión #0:0: Vídeo: h264 ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 16:11 DAR 20:11], q=2-31, 25 fps, 25 tbr, 50 tbn
    Stream #0:1(eng): Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, estéreo, 192 kb/s
Mapeo de corrientes:
  Secuencia #0:0 -> #0:0 (copiar)
  Secuencia #0:1 -> #0:1 (copiar)
No se pudo escribir el encabezado para el archivo de salida n.° 0 (¿parámetros de códec incorrectos?): Argumento no válido

La otra cosa que probé fue empaquetarlo con ffmpeg en ismv:

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

Esto funciona bien hasta ahora, pero luego necesito la herramienta ismindex para crear los archivos de manifiesto, pero esto falla:

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

¿Hay algo que estoy haciendo mal o tal vez haya algún problema con mi archivo de entrada?

Respuesta1

Entonces, de las 2 posibles soluciones que pensé que tenía en mi pregunta, ambas pueden funcionar, pero tienen un resultado final diferente.

Muxer ISMV + ismindex

Lo que necesitaba era un conjunto de archivos del lado del servidor (.ism, .ismc, .ismv). Para lograr esto, terminé haciendo las siguientes 2 cosas:

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

El comando anterior copia las transmisiones de video sin transcodificarlas, transcodifica el audio a AAC (aunque parece que a ffmpeg e ismindex tampoco les importa el audio MP2) y lo empaqueta en un .ismv.

ismindex -n ss_out ss_out.ismv

La herramienta ismindex puede entonces crear los archivos .ism y .ismc que necesito.

Los archivos que obtuve de esto se podían transmitir a través de IIS con Media Services.

Muxer de transmisión fluida

También conseguí que el muxer 'smoothstreaming' funcionara al final, el truco fue que también necesitaba un archivo .ismv como entrada. Así que primero ejecuté el mismo comando ffmpeg que el anterior, después de lo cual pude usar ffmpeg nuevamente para volver a empaquetarlo con el muxer 'smoothstreaming'.

Sin embargo, el problema que tuve con esta solución es que genera los archivos necesarios para que un servidor web convencional realice una transmisión fluida. por lo que tiene los fragmentos de video divididos y los metadatos por fragmento. Todo lo cual normalmente lo maneja el servidor de transmisión.

información relacionada