Introducción a Codecs y Contenedores

Contenedores

El video por lo general no se puede distribuir como un stream de bytes puro compreso con su codec. Al contrario, necesita ser encapsulado dentro de un archivo o un stream que le permita ser acelerado, retrocedido, y sincronizado con las pistas de audio y de subtítulos. Para hacer toda esta organización se han desarrollado varios tipos de "contenedores". Ya que esta es la capa exterior del archivo con el que el usuario va a interactuar, los contenedores a veces se les llama también "formatos"; sin embargo, es por lo general incorrecto llamarlos formatos ya que para saber el formato real de un archivo de video hay que saber qué tipo de codecs de audio, video, y subtítulos hay en el archivo. Muchos de estos contenedores son capaces de soportar más de un tipo de codecs en estas tres categorías.
http://en.wikipedia.org/wiki/Container_format_(digital)
http://en.wikipedia.org/wiki/Comparison_of_container_formats
http://es.wikipedia.org/wiki/Formato_contenedor

MPEG-PS - Motion Picture Experts Group - Program Stream. Es usado para almacenar data de video para uso en DVDs y discos BluRay. Es compatible con video MPEG 1,2, y 4, varios tipos de audio MPEG, y subtítulos.   http://en.wikipedia.org/wiki/MPEG_program_stream http://es.wikipedia.org/wiki/Program_Stream
MPEG-TS - Motion Picture Experts Group - Transport Stream, es usado para transmitir data de video, especialmente en casos en los que algo de data se puede perder en tránsito. Además de streams puros de data, también puede contener streams de programas.  http://en.wikipedia.org/wiki/MPEG_transport_stream http://es.wikipedia.org/wiki/Transport_Stream
Microsoft Audio Video Interleave (AVI) - A pesar de algunas limitaciones técnicas, el formato AVI ha sido muy común para videos disponibles para descarga en el internet, especialmente aquellos codificados con los codecs DivX o Xvid. Su popularidad ha comenzado a declinar a la vez que el uso de formatos MKV y MP4 aumenta. Dicho eso, todavía es muy común encontrar videos en este contenedor.  http://en.wikipedia.org/wiki/Audio_Video_Interleave   http://es.wikipedia.org/wiki/Avi
Quick Time (MOV) - Este es el contenedor usado con películas para el programa QuickTime de Apple. A estas alturas ha sido reemplazado en iTunes y QuickTime por el contenedor MP4. http://en.wikipedia.org/wiki/.mov
Windows Media Video (WMV aka ASF) - Este es el contenedor principal de Microsoft, capaz de soportar todos los codecs de Microsoft así como algunos otros. Generalmente la extensión .wmv implica que uno de los codecs de video WMV se está usando a la par con el codec de audio WMA. Si otros codecs se están usando, Microsoft recomienda que se use la extensión .asf en lugar de .wmv. http://en.wikipedia.org/wiki/Windows_Media_Video http://es.wikipedia.org/wiki/Wmv
Flash Video (FLV) - Flash Video es común en situos web que muestran video clips (como YouTube). Hay varios codecs de video que son compatibles con este contenedor, el más común es H.263. Las versiones más recietes del Flash Player también soportan MP4 o WebM, y por eso ya no es requisito usar este contenedor FLV al trabajar con el Flash Player. http://en.wikipedia.org/wiki/Flash_Video http://es.wikipedia.org/wiki/Flv
Ogg - Este es el primer contenedor de código abierto que obtuvo amplio uso inicialmente. Era compatible mayormente con el codec de video Theora y el codec de audio Vorbis. Al día de hoy este contenedor no se usa ampliamente; el contenedor MKV es su sucesor de código abierto principal. Sin embargo, este contenedor es mejor para el streaming de audio y video de MKV, por lo que se utiliza a frecuentemente para eso. http://en.wikipedia.org/wiki/Ogg http://es.wikipedia.org/wiki/Ogg
MPEG-4 (MP4 aka M4V) - Este es el formato de archivo estándar que el grupo MPEG diseñó para contener video MPEG 4, aunque no está limitado a ese tipo de video solamente. Este contenedor es muy similar al MOV de QuickTime, y se usa en iTunes para videos. El formato más típico de MP4 contiene video MPEG4-AVC/H.264 y audio AAC. es soportado por el Flash Player en navegadores web, y en los navegadores Internet Explorer y Safari para video HTML 5. http://en.wikipedia.org/wiki/MPEG-4_Part_14 http://es.wikipedia.org/wiki/MPEG-4_Parte_14
Matroska (MKV) - Este es un formato contenedor de código abierto y múltiples usos. Este formato puede almacenar casi todo tipo de video, audio y subtítulos. También puede almacenar múltiples pistas dentro de cada categoría (múltiples pistas de audio, o de video, etc.), permitiendo que una película tenga varios idiomas distintos o comentario del director simultáneamente, por ejemplo.  http://en.wikipedia.org/wiki/Matroska http://es.wikipedia.org/wiki/Mkv
WebM - Esta es una versión más simple de MKV que solamente soporta el codec de video VP8 y el codec de audio Vorbis. WebM fue creado por Google para uso libre de regalías en el internet para web video. Es soportado en el estándar de video HTML 5 en Firefox y Chrome, con soporte en Internet Explorer también disponible en forma de un plug-in. También es soportado en navegadores web por medio del Flash Player. http://en.wikipedia.org/wiki/WebM http://es.wikipedia.org/wiki/WebM

Compresión de Video y Codecs

El video es IN MENSO. Si tenemos un stream de video 1080p (1920x1080) usando YUV 4:2:2 (16 bits/pixel = 2 bytes/pixel), a 30fps (Frames Per Second/imágenes por segundo), esto resultaría en 124MB/sec (1920*1080*2*30) o 7.5GB/min o casi 0.5TB por hora! No sería posible poseer muchas películas si fuera necesario tener un disco duro de 1TB para cada película de dos horas que quisiéramos ver. Afortunadamente, el video es altamente comprimible. La compresión de video se hace usando codificadores y decodificadores, o en otras palabras CODECs (COdificador/DECodificador).

Hay muchos tipos de codecs para compresión de video. Algunos de los más simplen toman el proceso de compresión estándar para imágenes (como JPEG) y lo aplican a cada imagen dentro del video. Esto por sí solo puede recortar drásticamente la cantidad de espacio necesario para almacenamiento. Cuando trabajamos con esta compresión en la unidad de fotos, vimos que con una compresión JPEG decente, podemos comprimir una imagen de 30MB hasta casi 3MB. Si aplicamos esa misma proorción a nuestro video puro (1080p, YUV 4:2:2, 30fps), llegaríamos a alrededor de 12MB/seg, 720MB/min, 50GB/hr. Sólo como comparación, 12 MB/seg es aproximadamente la velocidad a la que puede operar un disco duro típico, así que esta compresión almenos sería posible de almacenarse en un computador normal. Si estás trabajando con video más pequeño (480p, YUV 4:2:0, 30fps), esto sería alrededor de 1.8MB/seg, que es muy accesible. De hecho, ya que es relativamente fácil de procesar, muchas cámaras digitales que también graban video usan este método de compresión para comprimir y almacenar su video en la memoria de la cámara.

Sin embargo, el video tiene otra ventaja que permite alcanzar proporciones de compresión mucho mayores. El truco es que casi toda la imagen dentro de un video es muy similar a la imagen que vino jusot antes de ella y la que va justo después. Las excepciones a esto es cuando la cámara está moviéndose rápidamente, o cuando hay un corte en el filme y comienza una nueva escena. Para aprovechar esta ventaja casi todos los codecs modernos usan compresión "interframe". Por ejemplo, una imagen le comunica al decoder que "este grupo de pixeles es el mismo que el que estaba 10 pixeles más arriba en la imagen anterior". A veces hay suficientes cambios en la imagen (un corte en el video) al punto que no es eficiente tratar de explicar la nueva imagen en términos de la imagen anterior. En ese caso, el codec simplemente olvida la imagen anterior por completo, y toma una nueva imagen (probablemente con algo similar a la compresión JPEG) que tiene calores para todos los pixeles. Luego con la siguiente imagen puede comenzar el mismo proceso de referencias. Esta nueva imagen se conoce como "Keyframe" (imagen clave), porque es esencial para hacer que el stream de imagenes fluyan claramente.

Hay muchos métodos complicados usados para procesar una compresión interframe usando keyframes. No vamos a estudiar las especificaciones aquí, pero es importante saber que son los detalles sobre cómo un codec trabaja una compresión los que determinan la diferencia entre todos los codecs modernos. Estos detalles son muy complicados. Sólo para dar un ejemplo, la lista de patentes usados en el estándar (muy antiguo) MPEG-2 para compresión interframe cubre varias páginas de contenido.

http://en.wikipedia.org/wiki/Video_compression
http://en.wikipedia.org/wiki/Video_compression_picture_types

http://en.wikipedia.org/wiki/Video_codec
http://es.wikipedia.org/wiki/Códec_de_vídeo

Algunos Codecs

Raw (Puro) - Un video no comprimido. Hay varios tipos de formateo puro.
MJPEG - Usa el formato para fotos JPEG para comprimir cada imagen en el video. Esto resulta en una proporción de compresión muy baja y en archivos de gran tamaño, pero es relativamente fácil de hacer. Muchas cámaras digitales que también capturan video usan este codec para codificar los archivos de video. http://en.wikipedia.org/wiki/Motion_JPEG http://es.wikipedia.org/wiki/MJPEG
MPEG 2 (aka H.262) - Este es el sucesor del primer estándar de video del Grupo de Expertos de Imágenes en Movimiento (Motion Picture Experts Group o MPEG), llamado MPEG 1. Al momento de la creación de los primeros DVDs, este era uno de los codecs más avanzados, y fue seleccionado para uso como el único codec soportado universalmente en DVDs. Desde ese entonces se han creado nuevos y mejores codecs, pero el estándar para DVDs no se ha podido cambiar, y por eso todo DVD todavía usa MPEG 2. http://en.wikipedia.org/wiki/MPEG-2 http://es.wikipedia.org/wiki/MPEG-2
VP3 (aka Theora) - Este es un codec más antiguo pero es significativo en que fue el primer codec de video distribuido bajo una licencia de código abierto, y fue llamado Theora. Este codec se puede implementar libremente por cualquier individuo en software y hardware. Sin embargo, ya que es antiguo, el desempeño de este codec no se compara con sus equivalentes modernos. El desempeño de Theora es mucho mejor que MPEG 2, pero un poco peor que la mayoría de las versiones de MPEG 4 parte 2.  http://en.wikipedia.org/wiki/Theora http://es.wikipedia.org/wiki/Theora
H.263 (aka Flash4) - Este es era el codec más usado en video flash que se podía ver en sitios web dentro de navegadores web. Actualmente está siendo reemplazado por el formato MPEG 4 AVC/H.264 en flash. Además, el estándar HTML 5 está empezando a reemplazar el video flash por completo, y usa video H.264 o WebM/VP8.
MPEG 4 Part 2 (aka DivX, XVID, MS MPEG4v3) - Este fue el primer uso a gran escala del estándar MPEG4. Una de las implementaciones originales fue hecha por Microsoft y se llamó Microsoft MPEG 4 Versión 3; sin embargo, Version 3 no era compatible con el formato base MPEG 4 part 2. Esto no impidió que los creadores de un proyecto llamado DivX copiaran este codec y lo distribuyeran libremente. A partir de esto, un grupo creón una versión de lo mismo en código abierto llamado Xvid. Por tanto, todos estos codificadores populares: MS MPEG 4v3, DivX y Xvid son todos MPEG 4 Parte 2 (pero no necesariamente compatibles con el estándar). Entre DivX y Xvid, la mayoría de los videos que estaban disponibles para descarga en el internet eran alguna vez (y muchos todavía son) MPEG 4 Parte 2. La razón para tanta popularidad es que era un gran paso adelante (con archivos aproximadamente 40% más pequeños) de MPEG 2. http://en.wikipedia.org/wiki/MPEG-4_Part_2 http://es.wikipedia.org/wiki/MPEG-4_Parte_2
MPEG 4 Part 10 (aka MPEG 4 - AVC, H.264) - Este codec es actualmente considerado el codec de mejor funcionamiento disponible. Puede generar tamaños de archivos que son aproximadamente 50% más pequeños comparado con los codecs MPEG 4 Parte 2. este codec está ahora disponible ampliamente y se distribuye con iTunes en sistemas Mac y también está en la estructura de Windows 7 También está disponible para reproducir video en la web con la actual versión de Flash plug-in. Y está siendo integrada al video HTML 5 en Internet Explorer (versión 9) y en Safari. Hay también plug-ins para que funcione en firefox y Chrome. Además de su uso para consumidores, hay una opción de H.264 sin pérdida (lossless), que es útil para almacenar video durante proyectos de edición o para propósitos de archivación.  http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC http://es.wikipedia.org/wiki/H.264/MPEG-4_AVC
VP8 - VP8 fue creado y distribuido al dominio público por Google (quien compró la compañía que lo creó). Está disponible por solo para su uso en muchos formatos y contenedores, pero es también el único codec de video soportado por el contenedor WebM. Este formato es también tan poderoso como el H.264, y a medida que su software mejora está muy cerca de parearse completamente con ese formato. el codec está disponible en forma nativa para su uso en video HTML 5 en los navegadores Firefox, Chrome, y Opera, y puede operar en Internet Explorer por medio de un plugin. También estará  disponible en la próxima versión del Flash Plugin. http://en.wikipedia.org/wiki/VP8 http://es.wikipedia.org/wiki/VP8
VC-1 (aka WMV3) - Este es el codec más reciente de Microsoft en su serie Windows Media. Su desempeño cae entre MPEG 4 Parte 2 y MPEG 4 Parte 10. Se encuentra generalmente sólo en plataformas de Windows. http://en.wikipedia.org/wiki/VC-1 http://es.wikipedia.org/wiki/VC-1
Dirac (aka VC-2) - Dirac y su implementación más popular, Schroedinger, es un codec desarrollado con una tecnología de compresión completamente diferente y de muy alta capacidad. Desafortunadamente esta tecnología no está terminada por complete y requiere una gran cantidad de capacidad de computación para codificar y decodificar un video. Dadas estas limitaciones, sólo se usa como un formato para almacenar video durante su edición y para archivación, en estudios profesionales con computadores de gran potencia.  http://en.wikipedia.org/wiki/Dirac_(video_compression_format) http://es.wikipedia.org/wiki/Dirac_(códec)
FFV 1 - Este es un codec que solamente comprime archivos sin pérdida, para uso durante edición y producción. Fue creado como parte del proyecto ffmpeg/libav. Es por lo general más rápido y con mejor compresión que todos los demás codecs sin pérdida excepto los codificadores sin pérdida x264's.

Codificación de Doble Paso (Two Pass Encoding)

La cantidad de compresión aplicada a un video depende mucho de lo que está ocurriendo en un video. Si hay mucho movimiento y muchos pixeles cambian de imagen a imagen, como en una escena de pelea en una película, va a ser difícil que el codificador pueda almacenar toda esa data en un archivo pequeño. O, si no hay mucho movimiento, por ejemplo cuando el video simplemente muestra a una persona hablando y sólo sus labios se están moviendo, es muy fácil que un buen codificador moderno simplemente actualize los pocos pixeles que van cambiando y deje todo lo demás sin tocarse. Todos los codificadores de video modernos permiten alguna cantidad de codificación con bitrate variable (Variable Bit-Rate encoding), en el que, al igual que en la sección de audio, algunas partes de un clip pueden usar más bits y otras partes pueden usar menos bits. Esto hace que el codificador pueda crear más facilmente algo que se vea bien, a la vez manteniendo constante el tamaño total de archivo. El reto para el video es que no es posible subir porciones grandes del video a la memoria del computador (de la forma en que se hace con el audio) para determinar cuales son las partes faciles/dificiles de comprimir. para esto se desarrolló la codificación de doble paso, o "two pass encoding".

Two pass encoding hace que el codificador analice el video clip dos veces. En el primer paso no se crea ningún archivo usable; en su lugar el codificador toma nota, en un archivo de record, sobre qué partes en el video podrían necesitar más bits y qué partes pueden usar menos bits al comprimirse. Armado con esta información, el codificador luego corre sobre el video una segunda vez. Esta vez sabe de antemano en qué momentos puede aumentar los bits y cuando puede reducirlos. Obviamente, esto no funciona con video en vivo, ya que el clip entero (o al menos una gran parte del mismo) no está disponible para analizarse antes de que se tenga que enviar la version final codificada. Sin embargo, para archivos de video que se crean para uso y distribución futura, esta es una forma mucho más eficiente de lograr una buena compresión.

Audio en Videos

Los codecs de audio usados son muchos de los mismos que conocimos en la unidad anterior sobre edición de audio, así que aquí sólo vamos a presentar una lista de algunos de los codecs más usados en video. Para muchos de estos codecs puedes volver a la sección de audio.

AC3 - Más común en DVD/BluRay
AAC - Video de Apple Online y BluRay
MP3 - Muchas veces mezclado con Xvid y AVI para videos amateur
Vorbis - Usado comúnmente con Theora o VP8/WebM.
FLAC - El formato sin pérdida (lossless) estándar usado en archivación de video
WMA - Usado en archivos de video de Microsoft