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