Un formato poco APEtecible

En ocasiones nos descargamos de la red un archivo de audio en formato APE. Y aunque lo podemos oír, quizás queramos convertirlo a otro formato mejor soportado en GNU/Linux, pero no sabemos como hacerlo. Si tenemos alguna posibilidad de conseguir ese audio (que, normalmente, suele ser música) en otro formato más convencional, entonces lo buscamos y lo descargamos. Pero si no, entonces la única alternativa que nos queda es encontrar el modo de convertir y trocear ese archivo APE en alguno de esos otros formatos (OGG, MP3 o FLAC, por ejemplo).

APE es un formato utilizado por Monkey’s Audio (MAC), un codificador que permite realizar conversiones sin pérdida de calidad. Los archivos APE suelen utilizarse para almacenar álbumes completos de música, por lo que, normalmente, suele venir acompañado por otro fichero de poco tamaño con extensión CUE, y que no es más que un fichero de texto plano donde se almacena información sobre el inicio y el final de cada pista de audio contenida en el archivo APE.

Desgraciadamente, el soporte oficial de GNU/Linux a este codificador no es muy bueno, más que nada porque posee una licencia propietaria. Aún así, es posible extraer y convertir las pistas de audio de un archivo APE a otros formatos libres haciendo uso de utilidades disponibles en los repositorios oficiales.

Voy a explicar como lo hago. Seguramente no es la mejor, ni la más rápida forma de resolver tal situación, pero es la que yo utilizo en las poquísimas ocasiones en las que lo necesito.

  1. En primer lugar instalamos -si no lo están ya- los paquetes necesarios:
    $ sudo aptitude install libjmac-java mp3splt libmp3splt0-mp3 libmp3splt0-ogg cuetools shntool flac
       

    No es necesario instalarlos todos. Según el formato al que vayamos a convertir, habrá que instalar unos u otros:
    MP3mp3splt libmp3splt0-mp3
    OGGmp3splt libmp3splt0-ogg
    FLACcuetools shntool flac

  2. En cualquiera de los tres casos, siempre se debe instalar el paquete libjmac-java. Dicho paquete es una implementación en Java del codificador MAC, y se utiliza para realizar una conversión de APE al formato WAV. A modo de muestra, he elegido una obra de Beethoven que me he descargado ad hoc.

    $ ~/Música/$ java -jar /usr/share/java/jmac.jar d Beethoven_Fantasia.Coral_Op.80.ape Beethoven_Fantasia.Coral_Op.80.wav
       

    A continuación muestro la salida en pantalla del proceso de conversión (clic para ver):

    Decompressing 'Beethoven_Fantasia.Coral_Op.80.ape'...
    Progress: 1.006 (53.1379324055666 seconds remaining)
    Progress: 2.012 (44.07511928429423 seconds remaining)
    Progress: 3.018 (40.136023194168324 seconds remaining)
    Progress: 4.025 (37.936950310559006 seconds remaining)
    Progress: 5.031 (36.48878493341284 seconds remaining)
    Progress: 6.037 (35.487102865661754 seconds remaining)
    Progress: 7.043 (34.64604926877751 seconds remaining)
    Progress: 8.05 (33.935832298136646 seconds remaining)
    Progress: 9.056 (33.33073498233215 seconds remaining)
    Progress: 10.062 (32.74129338103757 seconds remaining)
    Progress: 11.068 (32.16432923744127 seconds remaining)
    Progress: 12.075 (31.6748447204969 seconds remaining)
    Progress: 13.081 (31.196751395153274 seconds remaining)
    Progress: 14.087 (30.713272378788954 seconds remaining)
    Progress: 15.093 (30.27691472868217 seconds remaining)
    Progress: 16.1 (29.849639751552793 seconds remaining)
    Progress: 17.106 (29.43400888577107 seconds remaining)
    Progress: 18.112 (29.017070671378097 seconds remaining)
    Progress: 19.119 (28.580576180762588 seconds remaining)
    Progress: 20.125 (28.15965838509317 seconds remaining)
    Progress: 21.131 (27.75773758932374 seconds remaining)
    Progress: 22.137 (27.350710936441253 seconds remaining)
    Progress: 23.144 (26.951404078810928 seconds remaining)
    Progress: 24.15 (26.58047826086957 seconds remaining)
    Progress: 25.156 (26.193614883129275 seconds remaining)
    Progress: 26.162 (25.815923323904897 seconds remaining)
    Progress: 27.169 (25.46364124553719 seconds remaining)
    Progress: 28.175 (25.107521739130434 seconds remaining)
    Progress: 29.181 (26.70304160241253 seconds remaining)
    Progress: 30.187 (26.279031337993175 seconds remaining)
    Progress: 31.194 (25.85353356414695 seconds remaining)
    Progress: 32.2 (25.435527950310554 seconds remaining)
    Progress: 33.206 (25.005005541167257 seconds remaining)
    Progress: 34.213 (24.570376348171745 seconds remaining)
    Progress: 35.219 (24.14365558363383 seconds remaining)
    Progress: 36.225 (23.738912353347136 seconds remaining)
    Progress: 37.231 (23.356926378555503 seconds remaining)
    Progress: 38.238 (22.945524661331664 seconds remaining)
    Progress: 39.244 (22.553598206095202 seconds remaining)
    Progress: 40.25 (22.14090062111801 seconds remaining)
    Progress: 41.256 (21.742798138452592 seconds remaining)
    Progress: 42.263 (21.366364905472874 seconds remaining)
    Progress: 43.269 (21.00157521551226 seconds remaining)
    Progress: 44.275 (20.729322416713725 seconds remaining)
    Progress: 45.281 (20.345157659945674 seconds remaining)
    Progress: 46.288 (19.948215347390256 seconds remaining)
    Progress: 47.294 (19.573903328117733 seconds remaining)
    Progress: 48.3 (19.208209109730852 seconds remaining)
    Progress: 49.307 (18.84216462165615 seconds remaining)
    Progress: 50.313 (18.46634494067139 seconds remaining)
    Progress: 51.319 (18.091623609189575 seconds remaining)
    Progress: 52.325 (17.72425752508361 seconds remaining)
    Progress: 53.332 (17.327678241956047 seconds remaining)
    Progress: 54.338 (16.95203220582281 seconds remaining)
    Progress: 55.344 (16.595113327551314 seconds remaining)
    Progress: 56.35 (16.219828748890862 seconds remaining)
    Progress: 57.357 (15.838063863172763 seconds remaining)
    Progress: 58.363 (15.452554186727895 seconds remaining)
    Progress: 59.369 (15.09470154457714 seconds remaining)
    Progress: 60.375 (14.715231884057967 seconds remaining)
    Progress: 61.382 (14.340664885471313 seconds remaining)
    Progress: 62.388 (13.95348047701481 seconds remaining)
    Progress: 63.394 (13.578415780673247 seconds remaining)
    Progress: 64.4 (13.189136645962732 seconds remaining)
    Progress: 65.407 (12.803329062638557 seconds remaining)
    Progress: 66.413 (12.417171502567268 seconds remaining)
    Progress: 67.419 (12.033692000771298 seconds remaining)
    Progress: 68.426 (11.66963522637594 seconds remaining)
    Progress: 69.432 (11.289538310865304 seconds remaining)
    Progress: 70.438 (10.909795706862774 seconds remaining)
    Progress: 71.444 (10.54202592240076 seconds remaining)
    Progress: 72.451 (10.17606848766753 seconds remaining)
    Progress: 73.457 (9.815818710265871 seconds remaining)
    Progress: 74.463 (9.44892663470449 seconds remaining)
    Progress: 75.469 (9.07304725118923 seconds remaining)
    Progress: 76.476 (8.698306292170091 seconds remaining)
    Progress: 77.482 (8.32487687462895 seconds remaining)
    Progress: 78.488 (7.952160432167977 seconds remaining)
    Progress: 79.494 (7.5834074018164905 seconds remaining)
    Progress: 80.501 (7.208484863542064 seconds remaining)
    Progress: 81.507 (6.840687916375282 seconds remaining)
    Progress: 82.513 (6.467051313126416 seconds remaining)
    Progress: 83.52 (6.093574712643676 seconds remaining)
    Progress: 84.526 (5.718126848543645 seconds remaining)
    Progress: 85.532 (5.345406023476593 seconds remaining)
    Progress: 86.538 (4.971130278028148 seconds remaining)
    Progress: 87.545 (4.597445028271177 seconds remaining)
    Progress: 88.551 (4.225027633792954 seconds remaining)
    Progress: 89.557 (3.852821811807007 seconds remaining)
    Progress: 90.563 (3.479986882060002 seconds remaining)
    Progress: 91.57 (3.107417494812711 seconds remaining)
    Progress: 92.576 (2.735723470445904 seconds remaining)
    Progress: 93.582 (2.3656524972751214 seconds remaining)
    Progress: 94.588 (1.9939399078107163 seconds remaining)
    Progress: 95.595 (1.6223320780375579 seconds remaining)
    Progress: 96.601 (1.251248320410763 seconds remaining)
    Progress: 97.607 (0.8831890335734133 seconds remaining)
    Progress: 98.614 (0.5129580181312995 seconds remaining)
    Progress: 99.62 (0.1405832162216393 seconds remaining)
    Progress: 100.0 (0.0 seconds remaining)
       

  3. Ahora voy a convertir el fichero WAV a diversos formatos, ajustando al máximo el nivel de calidad de audio.

    • conversión a MP3:
      $ ffmpeg -i Beethoven_Fantasia.Coral_Op.80.wav -acodec libmp3lame -b:a 320k -ar 48000 Beethoven_Fantasia.Coral_Op.80.mp3
           

      Para ver la salida del comando ffmpeg haz clic aquí:

      Guessed Channel Layout for  Input Stream #0.0 : stereo
      Input #0, wav, from 'Beethoven_Fantasia.Coral_Op.80.wav':
        Duration: 00:18:20.83, bitrate: 1411 kb/s
          Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
      Output #0, mp3, to 'Beethoven_Fantasia.Coral_Op.80.mp3':
        Metadata:
          TSSE            : Lavf56.40.101
          Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p, 320 kb/s
          Metadata:
            encoder         : Lavc56.60.100 libmp3lame
      Stream mapping:
        Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
      Press [q] to stop, [?] for help
      size=   43003kB time=00:18:20.83 bitrate= 320.0kbits/s    
      video:0kB audio:43002kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002282%
           
    • conversión a OGG:
      $ ffmpeg -i Beethoven_Fantasia.Coral_Op.80.wav -acodec libvorbis -b:a 320k -ar 48000 Beethoven_Fantasia.Coral_Op.80.ogg
           

      Para ver la salida del comando ffmpeg haz clic aquí:

      Guessed Channel Layout for  Input Stream #0.0 : stereo
      Input #0, wav, from 'Beethoven_Fantasia.Coral_Op.80.wav':
        Duration: 00:18:20.83, bitrate: 1411 kb/s
          Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
      Output #0, ogg, to 'Beethoven_Fantasia.Coral_Op.80.ogg':
        Metadata:
          encoder         : Lavf56.40.101
          Stream #0:0: Audio: vorbis (libvorbis), 48000 Hz, stereo, fltp, 320 kb/s
          Metadata:
            encoder         : Lavc56.60.100 libvorbis
      Stream mapping:
        Stream #0:0 -> #0:0 (pcm_s16le (native) -> vorbis (libvorbis))
      Press [q] to stop, [?] for help
      size=   36179kB time=00:18:20.82 bitrate= 269.2kbits/s    
      video:0kB audio:35986kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.536766%
           
    • conversión a FLAC:
      $ ffmpeg -i Beethoven_Fantasia.Coral_Op.80.wav -acodec flac Beethoven_Fantasia.Coral_Op.80.flac
           

      Para ver la salida del comando ffmpeg haz clic aquí:

      Guessed Channel Layout for  Input Stream #0.0 : stereo
      Input #0, wav, from 'Beethoven_Fantasia.Coral_Op.80.wav':
        Duration: 00:18:20.83, bitrate: 1411 kb/s
          Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
      Output #0, flac, to 'Beethoven_Fantasia.Coral_Op.80.flac':
        Metadata:
          encoder         : Lavf56.40.101
          Stream #0:0: Audio: flac, 44100 Hz, stereo, s16, 128 kb/s
          Metadata:
            encoder         : Lavc56.60.100 flac
      Stream mapping:
        Stream #0:0 -> #0:0 (pcm_s16le (native) -> flac (native))
      Press [q] to stop, [?] for help
      size=   59497kB time=00:18:20.82 bitrate= 442.8kbits/s    
      video:0kB audio:59489kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.013605%
           
  4. Ya solo queda trocear el fichero resultante para extraer las pistas del audio original, para lo cual recurrimos al fichero CUE auxiliar, que contiene los datos relativos a cada pista (autor, nombre, instante de tiempo inicial y final).
    • extraer pistas del MP3:
      $ mp3splt -f -c Beethoven_Fantasia.Coral_Op.80.cue -o @n+-+@t Beethoven_Fantasia.Coral_Op.80.mp3
           

      Para ver la salida del comando mp3splt haz clic aquí:

      mp3splt 2.4.2 (13/05/12) - utilizando libmp3splt 0.7.2
      	Matteo Trotta <mtrotta AT users.sourceforge.net>
      	Alexandru Munteanu <io_fx AT yahoo.fr>
      THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
       Processing file 'Beethoven_Fantasia.Coral_Op.80.mp3' ...
       reading information from CUE file Beethoven_Fantasia.Coral_Op.80.cue ...
      
        Artist: Beethoven
        Album: Fantasia para piano, coros y orquesta en Do menor Opus 80
        Tracks: 6
      
       cue file processed
       info: file matches the plugin 'mp3 (libmad)'
       info: found Xing or Info header. Switching to frame mode... 
       info: MPEG 1 Layer 3 - 48000 Hz - Joint Stereo - FRAME MODE - Total time: 18m.20s
       info: starting normal split
         File "1 - Adagio.mp3" created                    
         File "2 - Allegro_Meno.allegro_Allegro.molto.mp3" created                 
         File "3 - Adagio.ma.non.troppo.mp3" created                             
         File "4 - Marcia.assai.vivace_Allegro.mp3" created                    
         File "5 - Allegretto.ma.non.troppo.mp3" created                     
         File "6 - Presto.mp3" created                                    
       Processed 45870 frames - Sync errors: 0
       file split (EOF)
           
    • extraer pistas del OGG:
      $ oggsplt -f -c Beethoven_Fantasia.Coral_Op.80.cue -o @n+-+@t Beethoven_Fantasia.Coral_Op.80.ogg
           

      Para ver la salida del comando oggsplt haz clic aquí:

      mp3splt 2.4.2 (13/05/12) - utilizando libmp3splt 0.7.2
      	Matteo Trotta <mtrotta AT users.sourceforge.net>
      	Alexandru Munteanu <io_fx AT yahoo.fr>
      THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
       Processing file 'Beethoven_Fantasia.Coral_Op.80.ogg' ...
       reading information from CUE file Beethoven_Fantasia.Coral_Op.80.cue ...
      
        Artist: Beethoven
        Album: Fantasia para piano, coros y orquesta en Do menor Opus 80
        Tracks: 6
      
       cue file processed
       info: file matches the plugin 'ogg vorbis (libvorbis)'
       info: Ogg Vorbis Stream - 48000 - 312 Kb/s - 2 channels - Total time: 18m.20s
       info: starting normal split
         File "1 - Adagio.ogg" created                    
         File "2 - Allegro_Meno.allegro_Allegro.molto.ogg" created                 
         File "3 - Adagio.ma.non.troppo.ogg" created                             
         File "4 - Marcia.assai.vivace_Allegro.ogg" created                    
         File "5 - Allegretto.ma.non.troppo.ogg" created                     
         File "6 - Presto.ogg" created                                    
       file split (EOF)
           
    • extraer pistas del FLAC:
      $ shnsplit -f Beethoven_Fantasia.Coral_Op.80.cue -t "%n - %p - %t" -o "flac flac -s -8 -o %f -" Beethoven_Fantasia.Coral_Op.80.flac
           

      Para ver la salida del comando shnsplit haz clic aquí:

      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [00 - Beethoven - pregap.flac] (0:05.20) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [01 - Beethoven - Adagio.flac] (3:18.25) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [02 - Beethoven - Allegro_Meno.allegro_Allegro.molto.flac] (6:14.02) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [03 - Beethoven - Adagio.ma.non.troppo.flac] (2:40.58) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [04 - Beethoven - Marcia.assai.vivace_Allegro.flac] (2:11.57) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [05 - Beethoven - Allegretto.ma.non.troppo.flac] (2:14.73) : 100% OK
      Splitting [Beethoven_Fantasia.Coral_Op.80.flac] (18:20.62) --> [06 - Beethoven - Presto.flac] (1:35.52) : 100% OK
           

Después de extraer las pistas, veremos que han sido generados varios ficheros de audio cuyos nombres encajan con el formato de salida que hayamos establecido en la opción -o (en el caso de MP3 u OGG) o -t (en el caso de FLAC) del comando correspondiente. En este ejemplo los nombres siguen el patrón AutorTítulo pista:

$ ls -l
-rw-r--r-- 1  56M ago  4  2008 Beethoven_Fantasia.Coral_Op.80.ape
-rw-r--r-- 1  922 mar 13 15:34 Beethoven_Fantasia.Coral_Op.80.cue
-rw-r--r-- 1  23K mar 13 17:50 00 - Beethoven - pregap.flac
-rw-r--r-- 1 9,7M mar 13 17:50 01 - Beethoven - Adagio.flac
-rw-r--r-- 1  20M mar 13 17:50 02 - Beethoven - Allegro_Meno.allegro_Allegro.molto.flac
-rw-r--r-- 1 6,5M mar 13 17:50 03 - Beethoven - Adagio.ma.non.troppo.flac
-rw-r--r-- 1 6,6M mar 13 17:50 04 - Beethoven - Marcia.assai.vivace_Allegro.flac
-rw-r--r-- 1 8,6M mar 13 17:50 05 - Beethoven - Allegretto.ma.non.troppo.flac
-rw-r--r-- 1 7,9M mar 13 17:45 06 - Beethoven - Presto.flac
-rw-r--r-- 1  59M mar 13 17:49 Beethoven_Fantasia.Coral_Op.80.flac
-rw-r--r-- 1 7,6M mar 13 15:35 1 - Adagio.mp3
-rw-r--r-- 1  15M mar 13 15:35 2 - Allegro_Meno.allegro_Allegro.molto.mp3
-rw-r--r-- 1 6,2M mar 13 15:35 3 - Adagio.ma.non.troppo.mp3
-rw-r--r-- 1 5,1M mar 13 15:35 4 - Marcia.assai.vivace_Allegro.mp3
-rw-r--r-- 1 5,2M mar 13 15:35 5 - Allegretto.ma.non.troppo.mp3
-rw-r--r-- 1 3,7M mar 13 15:35 6 - Presto.mp3
-rw-r--r-- 1  42M mar 13 14:23 Beethoven_Fantasia.Coral_Op.80.mp3
-rw-r--r-- 1 6,3M mar 13 15:39 1 - Adagio.ogg
-rw-r--r-- 1  13M mar 13 15:39 2 - Allegro_Meno.allegro_Allegro.molto.ogg
-rw-r--r-- 1 5,1M mar 13 15:39 3 - Adagio.ma.non.troppo.ogg
-rw-r--r-- 1 4,3M mar 13 15:39 4 - Marcia.assai.vivace_Allegro.ogg
-rw-r--r-- 1 4,5M mar 13 15:39 5 - Allegretto.ma.non.troppo.ogg
-rw-r--r-- 1 3,3M mar 13 15:39 6 - Presto.ogg
-rw-r--r-- 1  36M mar 13 15:24 Beethoven_Fantasia.Coral_Op.80.ogg
-rw-r--r-- 1 186M mar 13 13:38 Beethoven_Fantasia.Coral_Op.80.wav

Una vez que tengamos los ficheros de audio en el formato que queramos, podremos borrar el audio original:

$ rm *ape *cue 
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s