Stereo Mix w Linux


(roobal) #1

Jakiś czas temu zaistniała u mnie potrzeba zgrania pewnego materiału granego przez kartę dźwiękową z innego źródła niż plik dźwiękowy/wideo, przypomniało mi się że w Windows jest takie coś jak stereo mix. Zaglądam do ustawień karty dźwiękowej i oczywiście pod Linuksem tego nie widzę. Postanowiłem podzielić się rozwiązaniem tego zagadnienia, być może komuś się przyda. Wykorzystany w tym celu będzie konsolowy program o nazwie arecord , który powinien być dostarczony z Alsą.

W tym celu należy uruchomić terminal, włączyć dźwięk który ma być zgrany, np. z przeglądarki internetowej i wydać takie polecenie:

arecord -f cd nazwa_pliku

Oczywiście w ten sposób dźwięk zostanie zgrany do pliku o jakości CD, domyślnie jest to plik WAVE (częstotliwość próbkowania 44,1 kHz przy 16-bitach). Jakość jak i rodzaj pliku można dowolnie zmieniać, jednak na ten temat nie będę się rozpisywał, ponieważ wszystko ładnie opisano w podręczniku systemowym, wystarczy wydać w terminalu polecenie man arecord. Jak wiadomo, plik WAVE ze względu na jakość pochłonie sporą ilość wolnego miejsca na dysku, więc plik można w tzw. "locie" zakodowować do pliku mp3 dowolnej jakości przy pomocy również konsolowego Lame , który najprawdopodobniej trzeba sobie doinstalować. Kodowanie odbywać się będzie w taki sposób:

arecord -f cd | lame -h - plik.mp3

Jak widać Lame działa jako potok, więc plik wyjściowy WAVE jest od razu kodowany do pliku mp3 najwyższej jakości. W pierwszej części polecenia, nie ma potrzeby podawania nazwy dla pliku WAVE, ponieważ on i tak jest kierowany do Lame. Opcja -h odpowiada za kodowanie do najwyższej jakości (highest). Ważny jest ten myślnik przed nazwą pliku mp3 (tam są oczywiście przed i za nim spacje), oznacza on że Lame ma kodować standardowe wyjście skierowane do Lame, w tym wypadku tworzony przez arecord plik WAVE, o czym pisałem w pierwszym zdaniu tegoż akapitu. Więcej opcji, dotyczących kodowania przy pomocy Lame można znaleźć w man lame. Leniwi mogą napisać sobie taki skrypt, aby nie trzeba było za każdym razem klepać tego przydługiego polecenia :slight_smile:

#!/bin/sh


arecord -f cd | lame -h - $1.mp3

Ponieważ podałem w skrypcie zmienną $1 oznacza to, że nazwa pliku mp3 przyjmie nazwę jaką poda się jako argument skryptu, np. mój skrypt nazywa się stereo_mix , więc uruchamiając go w taki sposób:

./stereo_mix muzyczka

plik mp3 przyjmie nazwę muzyczka.mp3.

W przypadku mojej karty wymagana była również zmiana w ustawieniach karty dźwiękowej profilu z Analog Stereo Duplex na Analog Stereo Output.

Pozdrawiam!


(Gabrielmichalski) #2

  • Ani to fakt, ani to oczywistość. Nie ma tego w domyślnych kontrolkach dla PulseAudio. Nie generalizuj, nie każdy używa.

  • Nie można. Ograniczeniem jest użyty w danej karcie przetwornik A/C, akceptowana częstotliwość próbkowania, natywna rozdzielczość bitowa przetwornika A/C (2^16 vs. 2^24) i uzyskany S/N.

Nadpróbkowanie znajdziesz, ale nie w "arecord". Przetwarzanie przez floating point dla osiągnięcia mniejszych przekłamań w obróbce - to też w innym miejscu. Wpisywanie coraz to "większych cyferek" w składni dla "arecord" ma swoje granice, a plik "WAV" nie jest sztywno powiązany z "44,1 kHz przy 16-bitach", lecz powiązany jest z przetwarzaniem PCM.

Polecenie "man" wszystkiego tu nie podpowie. Nie generalizuj.

Składnię dla "arecord" podałeś oczywiście bez ustalenia ograniczeń czasowych dla konwersji i zapisu. Newbies się ucieszą. Szczególnie ze zjawiska clippingu, bo dyski mają pojemne, terminal im nie straszny a do nadużyć w kompresji sygnałów audio są już przyzwyczajeni.

Może lepiej zainteresować się programem "pavucontrol" ?...

  • "Audacity" zna już prawie każdy. Przynajmniej z nazwy.