trzewiczek info



12.02.2011 kod:blog
Dźwięk w terminalu II
Mój twardy dysk przepełniony jest plikami mp3 - mój telefon nie rozumie innego formatu, więc jestem do tego zmuszony. Chcąc publikować muzykę na swojej stronie internetowej wybieram format OGG. Jak w terminalu przekonwertować pliki z mp3 do ogg? Wystarczy lame, oggenc i mała rurka.

lame to mały program pozwalający na tworzenie plików w formacie mp3. Lista jego opcji jest długa, lecz dla nas najbardziej interesująca jest opcja --decode. To dzięki niej możemy odczytać plik w formacie mp3 w postaci surowego strumienia audio. Oczywiście nie poprawi to jakości dźwięku, ale pozwoli coś dalej z tym strumieniem zrobić.

Drugim potrzebnym nam programem jest oggenc - kodek formatu ogg vorbis. Choć jego lista opcji jest jeszcze dłuższa, my skorzystamy jedynie z jednej. Opcja --raw pozwala na wczytywanie surowego strumienia audio.

Połączenie (za pomocą rurki) wygląda mniej więcej tak:

lame --decode moj_plik.mp3 - | oggenc --raw - -o moj_plik.ogg

O co chodzi z tymi dodatkowymi - i |? Chodzi o to, że zarówno lame, jak i oggenc potrzebują dwóch plików - jednego wejściowego (jaki plik chcemy przekonwertować) i jednego wyjściowego (gdzie chcemy go zapisać)1. Żeby jednak połączyć działanie obu programów wykorzystujemy mechanizm Uniksowych rurek, czyli pipe. Samotne myślniki w naszej komendzie oznaczają: zapisz do/odczytaj ze standardowego strumienia wyjścia/wejścia, czyli de facto okna terminala2. Dzięki temu nie tworzymy tymczasowego pliku ze stanem pośrednim - jedno trafia od razu do drugiego.

Pozostaje tylko jedno pytanie: Jak zrobić to hurtem?. Do tego posłuży nam zwykła bashowa pętla:

for f in *mp3; 
    do 
        lame --decode $f - | oggenc --raw - -o ${f/mp3/ogg}; 
    done

Dla pewności dodam, że ${f/mp3/ogg} podmienia ciąg mp3 na ogg w nazwach plików, a całą tę komendę możemy zapisać w jednej linijce (co ja zazwyczaj robię).


1 W przypadku oggenc nazwa pliku wyjściowego poprzedzona musi być opcją -o
2 Gdybyśmy pominęli część zaczynającą się od |, surowy strumień audio wypisany został by w oknie terminala - nie polecam!

N E W S