redirecionar som (microfone) via ssh, como telefonar via ssh?

47

Como redirecionar o microfone de um computador para ouvi-lo em outro computador via ssh? Qual é o dispositivo certo ou qual é a linha de comando correta?

Alguns anos atrás, era fácil e divertido redirecionar o som de um microfone remoto para um computador local ou vice-versa - era um telefone fácil. Existem algumas instruções para isso, mas nenhuma delas parece funcionar em computadores / distribuições Linux mais recentes. Eu nem tenho um /dev/audiono meu computador (Fedora 17).

Eu acho que pode ter algo a ver com áudio de pulso. Ou não preciso de áudio de pulso para este telefone simples? Qual é o dispositivo certo?

Consigo ver todos os meus dispositivos de som quando inicio alsamixere pressiono a tecla F6. Mas não sei quais são os dispositivos na minha /devárvore.

erik
fonte

Respostas:

53

OK, acabei de encontrar e ainda funciona! Realmente engraçado. Você não precisa de aplicativos sofisticados, mensageiros instantâneos ou similares. Com este comando, você envia seu áudio para o host remoto.

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

Ou se você gosta mais do ffmpeg

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

Fonte: http://shmerl.blogspot.de/2011/06/some-fun-with-audio-forwarding.html


Se você deseja um telefone real:

O comando acima foi apenas para uma direção. Para a outra direção, você deve iniciar outra sessão ssh. Portanto, para receber o que o outro usuário diz a você, use

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

Ou se você gosta mais do ffmpeg

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

onde hw:3está o outro dispositivo que você deseja gravar (localize-o arecord -l; você também pode usar um nome de dispositivo, localize-o com arecord -L; em muitos casos, você pode apenas usar o dispositivo listado com o seguinte comando arecord -L | grep sysdefault:).

Atualizar

Em 2018, nos meus sistemas Fedora Linux, ffmpegnão há suporte para alsa incluído (parece ser o mesmo nos sistemas RaspberryPi com Raspbian). Mas existe uma solução simples sem recompilar. Basta canalizar a saída do arecord (o alsarecorder) para o ffmpeg:

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

Você obtém o dispositivo de entrada localizando- plughw:2o na saída do seguinte comando:

arecord -l

No meu caso, eu vejo card0e card2(minha webcam que tem microfone). Então eu escrevi plughw:2para card2.

Atualização 2 (sem mplayer)

Se você não tem ou gosta, mplayermas ffplay(do qual faz parte ffmpeg), pode usar:

  • áudio wave não comprimido (largura de banda alta, uso de CPU muito baixo no lado da gravação)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2" | ffplay -nodisp -
    
  • compactado com flac (baixa largura de banda, baixo uso da CPU no lado da gravação)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | flac - -o -" | ffplay -nodisp -
    
  • compactado com ogg (largura de banda muito baixa, alto uso da CPU no lado da gravação)

    ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | oggenc -" | ffplay -nodisp -
    
erik
fonte
11
Existe alguma razão para você estar fazendo, em cat - | mplayer -vez de apenas mplayer -?
28414 Chris Down
O motivo é: acabei de copiar o comando da fonte citada. Pode ser redundante. Eu apaguei, parece ainda funcionar. Talvez exista um caso em que isso fosse necessário e o autor soubesse disso sem dizer em seu post?
Erik
3

A resposta de Erik funciona bem, mas usando como está, usando flacou oggenc, há um atraso significativo.
Uma solução é adicionar -cache 256ao mplayercomando, para que fique da seguinte maneira:

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

Outra coisa a mencionar é que hoje em dia praticamente todas as distribuições modernas usam o PulseAudio, que assume o controle sobre o dispositivo de hardware; portanto, o uso plughw:2falhará se o PulseAudio estiver em execução.
Geralmente, defaultdeve funcionar bem e usar o PulseAudio, onde você pode usar pavucontrolou semelhante para selecionar a fonte de entrada desejada usando o PulseAudio.

Isso faria o comando da seguinte maneira:

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

MAS: Isso introduz um atraso. No meu caso, são cerca de oito segundos. Isso é terrível.


A solução é muito mais simples do que qualquer outro comando:

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

É isso aí. Isso está usando quase nenhuma CPU (0,1% de acordo com htop). Ele está usando ~ 60KB / s de largura de banda para mim.

Se você deseja som estéreo: ssh <user>@<host> "arecord -f cd" | aplay
Útil apenas se você tiver um microfone estéreo, aumenta a largura de banda para ~ 150 KB / s para mim. (Como também aumenta a taxa de amostragem para 44100Hz).

Mais informações sobre taxa de amostragem ( -r) e taxa de bits (afetadas por -f) podem ser encontradas aqui .
Basicamente: quanto mais baixo você for, pior será a qualidade, mas menor será a largura de banda necessária.

Esta solução é totalmente compatível com o PulseAudio, você pode controlar o dispositivo de saída, o volume e muito mais usando pactlou o pavucontrolaplicativo GUI:

pavucontrol

confete
fonte