Procesado de video [II]

La primera opción que pensé fue usar MEncoder, como cuenta Z. en su blog. Al abrir la página de manual de MPlayer en busca de las opciones a usar, encontré casi por casualidad la sección profiles. En lugar de usar un montón de parámetros para `mencoder’ se pueden crear perfiles en un archivo de configuración. En estos perfiles se especifican todas las opciones y así no hay que volver a acordarse ni preocuparse de cuáles son.

image

Para usar esta característica de mencoder creé el archivo ~/.mplayer/mencoder.conf con la siguiente configuración:

[w880]
profile-desc="MP4 encoding for SonyEricsson w880i"
# Encode with the given video codec and options
ovc=lavc=yes
lavcopts=vcodec=mpeg4:autoaspect=yes:vbitrate=256:acodec=libfaac:abitrate=96
vf=scale=320:240
o=output.mp4
aspect=4:3
sws=0

# Specify a frames per second value for the output file
ofps=15

# Output audio codec
oac=faac=yes
faacopts=br=96
af=volnorm=1

# Encode to the specified container format
of=lavf=yes
lavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes

[w880-hq]
profile-desc="HQ MP4 encoding for SonyEricsson w880i"
profile=w880
lavcopts=mbd=2:trell=yes:v4mv=yes
sws=2

Si preguntamos a mencoder nos desvolverá una lista de los perfiles definidos:

nauj27@arriba:~$ mencoder -profile help
MEncoder 2:1.0~rc1-0ubuntu13.1 (C) 2000-2006 MPlayer Team
CPU: AMD Athlon(tm) XP 1600+ (Family: 6, Model: 6, Stepping: 2)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0
Compiled with runtime CPU detection.
Available profiles:
        w880-hq HQ MP4 encoding for SonyEricsson w880i
        w880    MP4 encoding for SonyEricsson w880i

Y si preguntamos acerca de un perfil nos dará una información más detallada:

nauj27@arriba:~$ mencoder -show-profile w880
MEncoder 2:1.0~rc1-0ubuntu13.1 (C) 2000-2006 MPlayer Team
CPU: AMD Athlon(tm) XP 1600+ (Family: 6, Model: 6, Stepping: 2)
CPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0
Compiled with runtime CPU detection.
Profile w880: MP4 encoding for SonyEricsson w880i
 ovc=lavc=yes
 lavcopts=vcodec=mpeg4:autoaspect=yes:vbitrate=256:acodec=libfaac:abitrate=96
 vf=scale=320:240
 o=output.mp4
 aspect=4:3
 sws=0
 ofps=15
 oac=faac=yes
 faacopts=br=96
 af=volnorm=1
 of=lavf=yes
 lavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes

Ahora veamos qué significa cada uno de los parámetros definidos. El primero indica el códec de video que vamos a emplear, lavc, y la línea siguiente indica las opciones que se emplearán en dicho códec. En éste caso he especificado video en mpeg4, razón de aspecto automática, 256kbps para el video y 96kbps para el audio codificado usando la librería libfaac que comprime en formato AAC.

Las siguientes tres líneas escalan el video a 320x240px que es la resolución de la pantalla del teléfono, indican la razón de aspecto que se incluirá dentro de la información del contenedor y se indica un fichero de salida por defecto por si no es especificado posteriormente, output.mp4.

sws=0 indica que durante el escalado de la imagen se use un filtro bilineal rápido para obtener una calidad aceptable pero rápida de calcular.

ofps=15 indica que queremos 15 imágenes por segundo. Hay a quien le pueden parecer insuficientes pero la mayoría de la gente no apreciaremos realmente la diferencia.

oac=faac=yes, faacopts=br=96 y af=volnorm=1 son todos referidos al audio. El primero indica el formato, el segundo la tasa de bits por segundo y el tercero hace un procesado del audio para normalizar el volumen. La normalización consigue la máxima amplificación sin distorsión.

Por último, of=lavf=yes y la línea de lavfopts indican que el audio y el video se quieren multiplexar en un contenedor MP4.

Hay una opción adicional que es la que fastidió que pudiese usar éste método para transformar las pelíclas, y es lo siguiente:

lavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes

En realidad yo no puedo certificar que eso sea cierto. Ahora contaré por qué. En la compresión de video los tipos de imágenes que podemos encontrar son Intra coded frames, Predicted frames, y Bi-directional predictive pictures, también conocidos como I-Frames, P-Frames y B-Frames.

En los formatos definidos en el estandar MPEG, a menudo solo se almacenan diferencias entre imágenes en lugar de imágenes completas. Sin meterme en profundidad en el tema, diré grosso modo que:

– Los I-Frames son imágenes completas o imágenes clave (key frames) que son codificadas sin hacer referencia al resto de las imágenes del video.

– Los P-Frames requieren información de imágenes anteriores para ser decodificados, pueden contener información nueva así como vectores de desplazamiento de bloques de imágenes o combinaciones de ambos.

– Los B-Frames requieren la decodificación de imágenes anteriores para la representación completa de la imagen. Incluyen modos de predicción de regiones de movimiento, sacando un movimiento medio con predicciones basadas en el movimiento de objetos en imágenes del video anteriores.

Lo que se le está diciendo a mencoder con el parámetro mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes es que aseguro que mi video no contiene B-Frames, lo cual no es cierto en la gran mayoría de los casos. Resulta que mencoder usa algo llamado lavf para crear un contenedor de tipo MP4 y actualmente tiene un bug que hace que si el video contiene B-Frames el resultado sea un archivo corrupto que no sirve para mucho. Y efectivamente, el archivo resultante no lo reconoce ni Perry Mason.

Etiquetas: , ,

Archivado en:Multimedia, Video

No hay comentarios en “Procesado de video [II]”