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;
}
Publicar un comentario