19/8/2012

Van .ogg naar .mp3

Filed under: — cybrarian @ 12:50 am

In het kader van “Eén stap vooruit, twee stappen achteruit”* probeer ik mijn zorgvuldig opgebouwde CD-muziekverzameling, natuurlijk in .ogg formaat omgezet, (toen wel even moeten zoeken naar een .ogg compatibele player), nu om te zetten naar .mp3. Zoals het dikwijls gaat: externe oorzaak; een geschenk gekregen-gps die muziek kan spelen van mp3 formaat, maar (natuurlijk/helaas) niet .ogg.
(*) in België ook bekend als de processie van Echternach.

Er zouden heel wat desktop-programma’s zijn die de omzetting kunnen doen, maar meestal gaat dat over de omzetting tijdens het rippen of tijdens het transfereren naar de player, en meestal dus van kleine aantallen.
Ik zit met een hele verzameling, zo’n 10 Gb, onderverdeeld in mapjes en bestanden met de meest foute namen (spaties, leestekens enz).

Er zijn een paar problemen op te lossen:

  1. omzetten van .ogg naar .mp3
  2. uitvoeren van de omzetting op een hele directory
  3. toepassen van het omzetten op de volledige opslagstructuur met alle subdirectories.

De oplossingen (in de maak):

  1. mp3 encoding is meestal niet inbegrepen in de Linux distributies wegens juridische redenen ivm het mp3 formaat. Je kan er wel aangeraken, en de software daarvoor heet “lame”. Je kan checken of je die aanwezig hebt (bv al geïnstalleerd met een muziekspeler) door “lame –help” op de commandolijn. Indien niet aanwezig moet je “lame” downloaden; een zoek op bv “lame for opensuse 11.3” bracht me onmiddellijk naar de pagina met een 1 click install knop erop. Een klik daarop start een download en de vraag hoe te openen, kies of bevestig “Yast”. Geef je wachtwoord (voor installatie) en de lame onderdelen worden geïnstalleerd. Dat kan bevestigd je zien door het lame commando te proberen op de commandolijn:

    :~/Music/SelectionCar/Arno> lame –help
    LAME 64bits version 3.98.4 (http://www.mp3dev.org/)

    usage: lame [options] [outfile]

    and/or can be “-“, which means stdin/stdout.

    RECOMMENDED:
    lame -V2 input.wav output.mp3

    OPTIONS:
    -b bitrate set the bitrate, default 128 kbps
    -h higher quality, but a little slower. Recommended.
    -f fast mode (lower quality)
    -V n quality setting for VBR. default n=4
    0=high quality,bigger files. 9=smaller files
    –preset type type must be “medium”, “standard”, “extreme”, “insane”,
    or a value for an average desired bitrate and depending
    on the value specified, appropriate quality settings will
    be used.
    “–preset help” gives more info on these

    –longhelp full list of options

    –license print License information

    Eerste stap klaar.

  2. De twee stappen achteruit hebben betrekking op het omzetten van de ogg bestanden naar wav (maar dus vanuit de minder-dan-oorspronkelijke wav kwaliteit van de ogg bestanden) en het daaropvolgend omzetten naar mp3 in een vorm met meer kwaliteitsverlies. Als je de originele wav bestanden nog hebt kan je dus best daarop werken, want de tussenstap langs wav is nodig. Met dit python script dat ik ergens op internet vond kreeg ik een hele directory omgezet:
    #!/usr/bin/env python
    #
    # Simple python script to convert all ogg files in a current directory to mp3 format
    #
    import os
    import os.path
    #
    def get_files (extensions):
    files = os.listdir (os.getcwd())
    retfiles = []
    for file in files:
    for extension in extensions:
    if (file.endswith (extension)):
    retfiles.append (file)
    #
    return retfiles
    def convert_to_mp3 ():
    oggfiles = get_files ([ '.ogg', '.ogm'])
    #
    for ogg in oggfiles:
    ret1 = os.spawnlp (os.P_WAIT, 'oggdec', 'oggdec', ogg)
    if (ret1 == 0):
    rawfilename = os.path.splitext (ogg)
    wavfilename = rawfilename[0] + '.wav'
    mp3filename = rawfilename[0] + '.mp3'
    ret2 = os.spawnlp (os.P_WAIT, 'lame', 'lame', wavfilename, mp3filename)
    if (ret2 == 0):
    os.spawnlp (os.P_WAIT, 'rm', 'rm', wavfilename)
    #
    convert_to_mp3 ()

    met dit resultaat op het scherm (de getallen veranderen op het scherm live):

    OggDec 1.0.1
    Decoding “African Head Charge – 13 – Breeding Space.ogg” to “African Head Charge – 13 – Breeding Space.wav”
    [100.0%]
    LAME 3.98.4 64bits (http://www.mp3dev.org/)
    Using polyphase lowpass filter, transition band: 16538 Hz – 17071 Hz
    Encoding African Head Charge – 13 – Breeding Space.wav
    to African Head Charge – 13 – Breeding Space.mp3
    Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
    Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
    9346/9346 (100%)| 0:10/ 0:10| 0:10/ 0:10| 22.296x| 0:00
    ———————————————————————————————————————————————————————————————————————–
    kbps LR MS % long switch short %
    128.0 40.0 60.0 81.3 10.4 8.3
    Writing LAME Tag…done
    ReplayGain: +0.5dB

  3. De volgende stap is het aflopen van de hele directorystruktuur en in elke subdirectory te checken of er .ogg bestanden zijn en zo ja, ze omzetten. (wordt mogelijk vervolgd).
    In de huidige map zoeken naar alle .ogg bestanden: find . -name "*.ogg"

    Als je wil tellen hoeveel het er zijn (alleen de .ogg bestanden, niet de subdirs en andere files):
    find . -name "*.ogg" | wc -l

    Ik maakte eerst dit om door de directories te lopen:
    #/bin/bash
    workingdir=`pwd`;
    IFS="`printf '\n\t'`"
    for dir in `find . -type d ` ; do
    #echo "$dir"
    cd "$dir"
    pwd
    cd $workingdir
    done

    Toen dat bleek te werken op een test directory met een paar mappen en een paar submappen, paste ik het aan om de bestanden ook effectief om te zetten met het python omzetscript; dat wordt dus aangeroepen nu:

    #/bin/bash
    workingdir=`pwd`;
    IFS="`printf '\n\t'`"
    for dir in `find . -type d ` ; do
    #echo "$dir"
    cd "$dir"
    pwd
    ~/bin/PythonOggToMp3.py
    cd $workingdir
    done

    Als je het script draait op een grote verzameling mappen en ogg files, kan het wel even duren voor het klaar is. Als je een laptop gebruikt, hang hem dan zeker aan de stroom zodat hij niet midden in de omzetting stilvalt. Dat heeft nog het bijkomende voordeel dat hij meestal een snellere processorwerking ingesteld heeft (trager op batterij=stroom sparen).

    En als je wil kan je eerst of nadien nog de bestandsnamen opkuisen met “detox -v ./*”, als variatie in voorgaand script. Het is voor allerlei doeleinden bruikbaar. En natuurlijk zullen er wel eenvoudigere, snellere, gebruiksvriendelijkere, alles-in-1-lijn-code, enz mogelijkheden zijn om ditzelfde probleem op te lossen. Deze oplossing is niet toevallig buiten de grafische gebruiksomgeving gehouden; ik wilde een oplossing die ik ook kan gebruiken op een bestandsserver waar ik de originele muziek heb opstaan, een server zonder grafische schil.

Powered by WordPress