przekierować dźwięk (mikrofon) przez ssh, jak dzwonić przez ssh?

47

Jak mogę przekierować mikrofon jednego komputera, aby słuchać go na innym komputerze przez ssh? Które urządzenie jest właściwe, a które właściwe?

Kilka lat temu przekierowanie dźwięku ze zdalnego mikrofonu do lokalnego komputera było łatwe i przyjemne - to był łatwy telefon. Jest na to kilka instrukcji , ale żadna z nich nie działa na nowszych komputerach / dystrybucjach systemu Linux. Nie mam nawet /dev/audiona swoim komputerze (Fedora 17).

Myślę, że może to mieć coś wspólnego z dźwiękiem pulsacyjnym. Czy też nie potrzebuję pulsacyjnego dźwięku dla tego prostego telefonu? Które urządzenie jest odpowiednie?

Widzę wszystkie moje urządzenia dźwiękowe po uruchomieniu alsamixeri naciśnięciu klawisza F6. Ale nie wiem, jakie są urządzenia w moim /devdrzewie.

erik
źródło

Odpowiedzi:

53

OK, właśnie go znalazłem i nadal działa! Naprawdę śmieszne. Nie potrzebujesz żadnych wymyślnych aplikacji, komunikatorów itp. Za pomocą tego polecenia wysyłasz dźwięk do zdalnego hosta.

arecord -f cd -t raw | oggenc - -r | ssh <user>@<remotehost> mplayer -

Lub jeśli bardziej lubisz ffmpeg

ffmpeg -f alsa -ac 1 -i hw:3 -f ogg - \
    | ssh <user>@<remotehost> mplayer - -idle -demuxer ogg

Źródło: http://shmerl.blogspot.de/2011/06/some-fun-with-audio-forwarding.html


Jeśli chcesz prawdziwy telefon:

Powyższe polecenie dotyczyło tylko jednego kierunku. W innym kierunku musisz rozpocząć kolejną sesję ssh. Tak więc, aby otrzymać to, co mówi ci inny użytkownik , użyj

ssh <user>@<remotehost> 'arecord -f cd -t raw | oggenc - -r' | mplayer -

Lub jeśli bardziej lubisz ffmpeg

ssh <user>@<remotehost> ffmpeg -f alsa -ac 1 -i hw:3 -f ogg - \
    | mplayer - -idle -demuxer ogg

gdzie hw:3znajduje się urządzenie, które chcesz nagrać (znajdź go arecord -l; możesz również użyć nazwy urządzenia, znajdź to za pomocą arecord -L; w wielu przypadkach możesz po prostu użyć urządzenia wymienionego za pomocą następującego polecenia :) arecord -L | grep sysdefault.

Aktualizacja

W 2018 r. Na moich systemach Linux Fedora ffmpegnie ma obsługi alsa (wydaje się, że jest tak samo na systemach RaspberryPi z Raspbian). Ale istnieje proste rozwiązanie bez ponownej kompilacji. Po prostu potokuj wyjście arecord (alsarecorder) do ffmpeg:

ssh <user>@<remotehost> 'arecord -f cd -D plughw:2 | ffmpeg -ac 1 -i - -f ogg -' \
    | mplayer - -idle -demuxer ogg

Otrzymujesz urządzenie wejściowe, plughw:2znajdując je w danych wyjściowych następującego polecenia:

arecord -l

W moim przypadku widzę card0i card2(moja kamera internetowa z mikrofonem). Więc napisałem plughw:2dla card2.

Aktualizacja 2 (bez MPlayera)

Jeśli nie masz lub nie lubisz, mplayerale ffplay(co jest częścią ffmpeg), możesz użyć:

  • nieskompresowany dźwięk falowy (wysoka przepustowość, bardzo niskie zużycie procesora po stronie nagrywania)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2" | ffplay -nodisp -
    
  • skompresowany flac (niska przepustowość, niskie zużycie procesora po stronie nagrywania)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | flac - -o -" | ffplay -nodisp -
    
  • skompresowany z ogg (bardzo mała przepustowość, wysokie użycie procesora po stronie nagrywania)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | oggenc -" | ffplay -nodisp -
    
erik
źródło
1
Czy jest jakiś powód, dla którego robisz cat - | mplayer -zamiast tego mplayer -?
Chris Down
Powód jest taki: Właśnie skopiowałem polecenie z cytowanego źródła. Może być zbędny. Usunąłem go, wydaje się nadal działać. Może jest przypadek, w którym był potrzebny, a autor wiedział o tym, nie informując o tym w swoim poście?
erik
3

Odpowiedź Erika działa dobrze, ale używanie jej takim, jakim jest, używanie flaclub oggenc, istnieje znaczne opóźnienie.
Rozwiązaniem jest dodanie -cache 256do mplayerpolecenia, aby wyglądało to następująco:

ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | oggenc -" | mplayer -cache 256 -

Inną rzeczą, o której należy wspomnieć, jest fakt, że obecnie prawie każda nowoczesna dystrybucja korzysta z PulseAudio, która przejmuje kontrolę nad urządzeniem sprzętowym, dlatego korzystanie plughw:2nie powiedzie się, jeśli PulseAudio jest uruchomione.
Ogólnie rzecz biorąc, defaultpowinien działać dobrze i korzystać z PulseAudio, gdzie można użyć pavucontrollub podobnego, aby wybrać żądane źródło wejściowe za pomocą PulseAudio.

Dzięki temu polecenie będzie wyglądać następująco:

ssh <user>@<remotehost> "arecord -f cd | oggenc -" | mplayer -cache 256 -

ALE: To wprowadza opóźnienie. W moim przypadku jest to około ośmiu sekund. To straszne.


Rozwiązanie jest znacznie prostsze niż jakiekolwiek inne polecenie:

ssh <user>@<host> "arecord -f S16_LE -r 36000" | aplay

Otóż ​​to. Wykorzystuje to prawie żaden procesor (zgodnie z 0,1% htop). Wykorzystuje dla mnie ~ 60KB / s przepustowości.

Jeśli chcesz dźwięku stereo: ssh <user>@<host> "arecord -f cd" | aplay
Przydaje się tylko, jeśli masz mikrofon stereo, dla mnie zwiększa przepustowość do ~ 150 KB / s. (Ponieważ podnosi również częstotliwość próbkowania do 44100 Hz).

Więcej informacji na temat częstotliwości próbkowania ( -r) i częstości bitów (na które ma wpływ -f) można znaleźć tutaj .
Zasadniczo: im niższy poziom, tym gorsza jakość, ale mniejsza wymagana przepustowość.

To rozwiązanie jest w pełni kompatybilne z PulseAudio, możesz kontrolować urządzenie wyjściowe, głośność i więcej za pomocą pactllub pavucontrolaplikacji GUI:

pavucontrol

konfetti
źródło