Codificación y distribución de video con FFMPEG

Un gran reto es encontrar una solución para codificar y entregar videos para tantas plataformas como sea posible. Lo único que se tiene en claro es usar mpeg4 para máxima compatibilidad, ya que se desea compatibilidad con Desktop (flash), iphone, ipad, Android, symbian, BlackBerry y quizá muchas mas plataformas en el futuro.
Para desarrollar un proyecto que cubra estos requerimientos tenemos que tener en cuenta lo siguiente:

Posibles Servidores

  • Flash Media Server (rtmp and rtmpt via http tunneling, fácil configuración)
  • red5 (rtmp, configuración algo complicada, requiere conocimientos de java)
  • Webserver only (http progressive download)
  • Wowza Server (rtmp, rtmpt)
 
Seleccionado el servidor de video procedemos a evaluar la parte de codificación. Debe ser una codificación rápida porque tenemos muchos idiomas de audio diferentes, la pista de vídeo es casi el mismo. La única manera de hacer esto, es la posibilidad de codificar el vídeo por separado del audio para luego juntarlos.

Posibles soluciones de Encoding

  • Adobe Media Encoder (Muy buena calidad, No muxing, algunas veces los videos no son reproducibles en iDevices)
  • Sorenson Squeeze (No muxing)
  • ffmpeg en combinación con mp4box (Muy buena calidad de codificación, soporte muxing)
 
Tenemos muy en claro que la mejor opción es el uso de FFMPEG. Siempre es necesario contar con la versión de FFMPEG compilado con el soporte de LIBX264.

Parámetros de codificación

Codificación: Alta Calidad
  • ffmpeg -y -i in.avi -pass 1 -vcodec libx264 -b 750k -g 300 -bf 3 -refs 6 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method umh -subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 3 -flags2 +dct8x8+wpred+bpyramid+mixed_refs -trellis 1 -partitions +parti8x8+parti4x4+partp8x8+partp4x4+partb8x8 -acodec libfaac -ab 64k out-high.mp4
Codificación: Baja Calidad
  • ffmpeg -y -i in.avi -pass 1 -s 384x288 -vcodec libx264 -b 230k -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 0 -flags2 +mixed_refs -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -acodec libfaac -ab 32k -ac 1 out-low.mp4
  • mp4box -inter 500 -hint out-high.mp4
  • mp4box -inter 500 -hint out-low.mp4
Codificación: Audio solamente
  • ffmpeg -y -i "audio-lc.wav" -acodec libfaac -ab 64k -ac 1 audio-lc-64.m4a
  • ffmpeg -y -i "audio-lc.wav" -acodec libfaac -ab 32k -ac 1 audio-lc-32.m4a

Muxing Audio y Video

  • mp4box -add audio-lc-32.m4a#audio out-low-lc.mp4
  • mp4box -add out-low.mp4#video out-low-lc.mp4
  • mp4box -inter 500 -hint out-low-lc.mp4
  • mp4box -add audio-lc-64.m4a#audio out-high-lc.mp4
  • mp4box -add out-high.mp4#video out-high-lc.mp4
  • mp4box -inter 500 -hint out-high-lc.mp4