viernes, 26 de octubre de 2007

Video del CIE, Segunda Ediciòn

Ayer por la tarde tuve que codificar una segunda versión del video promocional del CIE. Hice dos versiones: una FMP4/MP3VBR y otra H264/AAC. Esta última disponible en http://tinyurl.com/2jlmub.

Desafortunadamente, uno de los requisitos que no me habían dicho era que el dichoso video tiene que verse en un Windows (Vista/XP) vil y silvestre (out-of-the-box), sin ningùn codec extra instalado. Como era de esperarse, las capacidades multimedia del infame sistema operativo son miserables.

Utilizando el mencoder codifiqué una serie de vídeos en MPEG1/MP2CBR. Los vídeos generados se podían ver en Linux, en MacOSX y hasta con el reproductor multimedia de la LifeDrive, pero siempre fallaban en Windows. Al final encontré una combinación que funcionó. Por supuesto, no podía yo dejar de utilizar la técnica de las dos pasadas :-)


#!/bin/bash -x
#
# This one is to create a very basic MPG video/audio file
# playable with out-of-the-box stupid Windows
#
# It's is also playable with out-of-the-box Macintosh/QuickTime
#
# Even you can play it with totem!

time mencoder -quiet -ofps 30000/1001 -o pass1.mpg \
-of lavf -lavfopts format=mpg \
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames \
-vf softskip,scale=320:240,harddup \
-oac lavc -srate 44100 -af lavcresample=44100 \
-lavcopts acodec=mp2:abitrate=224 \
-ovc lavc -lavcopts aspect=4/3:vcodec=mpeg1video:keyint=15:vrc_buf_size=327:vrc_minrate=1152:vbitrate=1152:vrc_maxrate=1152:vmax_b_frames=0:trell:mbd=2:precmp=2:subcmp=2:cmp=2:cbp:mv0:turbo:vpass=1 \
$@

time mencoder -quiet -ofps 30000/1001 -o pass2.mpg \
-of lavf -lavfopts format=mpg \
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames \
-vf softskip,scale=320:240,harddup \
-oac lavc -srate 44100 -af lavcresample=44100 \
-lavcopts acodec=mp2:abitrate=224 \
-ovc lavc -lavcopts aspect=4/3:vcodec=mpeg1video:keyint=15:vrc_buf_size=327:vrc_minrate=1152:vbitrate=1152:vrc_maxrate=1152:vmax_b_frames=0:trell:mbd=2:precmp=2:subcmp=2:cmp=2:cbp:mv0:vpass=2 \
$@

lunes, 22 de octubre de 2007

AAC, OGG, MP3. Y el ganador es...

El fin de semana me puse a revisar mi colección de discos, y entre otras cosas, a probar el formato de audio del MPEG4: AAC. Así que agarré mi viejos programas para codificar los discos, y los peguè en uno solo. Pero no me gustaba la vieja idea de tener un archivote WAV y luego correr los tres codificadores, así que me di a la tarea de utilizar cauces (pipes). Si bien el programa funciona, no es a prueba de balas: falta agregar código para atrapar los errores en los cauces, pero ¿a quién le importa?

Hacer el programa fue divertido, pero los resultados no lo fueron tanto. Ya de antemano se que el OGG es por mucho superior al MP3. Pero había que probar las nuevas tencologías. Así cada pista fue codificada en los cuatro formatos: OGG(vorbis), MP3(vbr), AAC (que no acepta "tags") y MP4 (aac con tags).

Codificar los archivos fue fácil: reproducirlos fue otra historia. El mplayer tocó todos sin problemas. El XMMS nunca pudo tocar los archivos AAC, ni los MP4. Hice una prueba con el Pocket-Tunes de la Live Drive: los archivos MP4 se los salta y aunque logró reproducir los archivos AAC es imposible posisionar la melodìa pues no funciona la barra y hay que escucharlos de principio a fin. Por si fuera poco, la calidad del sonido deja mucho que desear. Para mí, en este momento, AAC/MP4 no es una buena opción :-(

Pero no todo se perdió: quitè las líneas del AAC/MP4 y ahora tengo un programa que codifica al mismo tiempo en MP3 y OGG. MP3 para los reproductores convencionales (¡rayos! me acabo de dar cuenta: el estéro, la grabadora portátil y el reproductor del coche TODOS son SONY), y OGG para cargar en la PALM. No me cabe duda: el mejor formato sigue siendo OGG. Larga vida al Vorbis.

faac-1.25-2.fc7
lame-3.97-1.fc7
vorbis-tools-1.1.1.svn20070412-2.fc7
icedax-1.1.6-1.fc7
perl-5.8.8-23.fc7
fedora-release-7-3


#!/usr/bin/perl -wls
#
# perl -wls cddb2all.lp
#
# Reads a CDDA to WAV, then uses LAME to encode at 96kbps
# Reads CDDB to insert ID3 tags
# Also encode with OGG VORBIS (why not?)
# comming soon: encode in AAC(mp4) format!
#
# Override Options:
#
# OGG QUALITY
# -QUALITY=3
#
# LAME PRESET
# -PRESET=fm
#
# TRACK INFO (not yet!)
# -ta=artist -tl=album -ty=year -tg=genre
# -tt='track1/track2/..' <- not yet!

use CDDB_get qw( get_cddb );

$QUALITY=3 unless $QUALITY;
$PRESET='fm' unless $PRESET;
$PREFIX='' unless $PREFIX;

# From CDDB_get
my %config;
# ask user if more than one possibility
$config{input}=0;

print "Trying get CDDB info...";

my %cd=get_cddb(\%config);

unless(defined $cd{title}) {
die "no cddb entry found";
}

{
print "artist: $cd{artist}";
print "title: $cd{title}";
print "category: $cd{cat}";
print "cddbid: $cd{id}";
print "trackno: $cd{tno}";

my $n=1;
foreach my $i ( @{$cd{track}} ) {
print "track $n: $i";
$n++;
}
}

print "Hit [Enter] to continue"; <>;

$id=$cd{id} unless $id;
$ta=$cd{artist} unless $ta;
$tl=$cd{title} unless $tl;
$ty=$cd{year} unless $ty;
$tg=$cd{genre} unless $tg;
$tn=0 unless $tn;

foreach my $tt ( @{$cd{track}} ) {
++$tn;
$tt =~ s/"//g; #" <- emacs get's confused #' twice!

$fn=$tt; $fn=~s/\W+//g; $fn=~s/\s+/_/g;

$bn=sprintf("%s%02d-%s", $PREFIX, $tn, $fn);
$of=sprintf("%s.mp3", $bn);
#
# LAME stuff
#
my $lame=qq(nice /usr/bin/lame --quiet);
$lame.=qq( --ta '$ta') if $ta;
$lame.=qq( --tl "$tl") if $tl;
$lame.=qq( --tt "$tt") if $tt;
$lame.=qq( --tn '$tn') if $tn;
$lame.=qq( --tg '$tg') if $tg;
$lame.=qq( --ty '$ty') if $ty;
$lame.=qq( --preset $PRESET - '$of');

print $lame;
#
# Now, the OGG stuff
#
$of=sprintf("%s.ogg", $bn);

$oggenc=qq(nice /usr/bin/oggenc --quiet);
$oggenc.=qq( -a '$ta') if $ta;
$oggenc.=qq( -l "$tl") if $tl;
$oggenc.=qq( -t "$tt") if $tt;
$oggenc.=qq( -N '$tn') if $tn;
$oggenc.=qq( -G '$tg') if $tg;
$oggenc.=qq( -d '$ty') if $ty;
$oggenc.=qq( -c '$tc') if $tc;
$oggenc.=qq( -q $QUALITY -o $of -);

print $oggenc;
#
# FAAC stuff
#
$of=sprintf("%s.aac", $bn);

$faac=qq(nice /usr/bin/faac);
$faac=qq( -o $of -);

print $faac;
#
# MP4 stuff
#
$of=sprintf("%s.mp4", $bn);

$mp4=qq(nice /usr/bin/faac);
$mp4.=qq( --artist '$ta') if $ta;
$mp4.=qq( --album "$tl") if $tl;
$mp4.=qq( --title "$tt") if $tt;
$mp4.=qq( --track $tn) if $tn;
$mp4.=qq( --genre '$tg') if $tg;
$mp4.=qq( --year '$ty') if $ty;
$mp4.=qq( -o $of -);

print $mp4;
#
# cdda2wav stuff
#
$cmd=qq(/usr/bin/icedax dev=/dev/cdrom --quiet -H -x -w -t $tn -);
print $cmd;
#
# run all of them!
#
open MP3, "| $lame" or die qq(Can't run $lame); binmode MP3;
open OGG, "| $oggenc" or die qq(Can't run $oggenc); binmode OGG;
open AAC, "| $faac" or die qq(Can't run $faac); binmode AAC;
open MP4, "| $mp4" or die qq(Can't run $mp4); binmode MP4;
open CDDA, "$cmd |" or die "Can't run $cmd"; binmode CDDA;
while(($bytes = sysread(CDDA, $buffer, 4096))>0) {
syswrite(MP3, $buffer, $bytes);
syswrite(OGG, $buffer, $bytes);
syswrite(AAC, $buffer, $bytes);
syswrite(MP4, $buffer, $bytes);
}
close CDDA;
close MP4;
close AAC;
close OGG;
close MP3;
}