
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.