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!