通过 ssh 重定向声音(麦克风),如何通过 ssh 打电话?

eri*_*rik 57 ssh remote audio telephony

如何通过 ssh 重定向一台计算机的麦克风以在另一台计算机上收听它?哪个是正确的设备或哪个是正确的命令行?

几年前,将声音从远程麦克风重定向到本地计算机,反之亦然——这是一部简单的电话。有一些 说明,但它们似乎都不适用于较新的计算机/Linux 发行版。/dev/audio我的电脑上什至没有(Fedora 17)。

我认为它可能与脉冲音频有关。或者我不需要这个简单电话的脉冲音频?哪个是正确的设备?

当我启动alsamixer并按 F6 键时,我可以看到我所有的声音设备。但我不知道我的/dev树中有哪些设备。

eri*_*rik 61

好的,我刚刚找到它,它仍然有效!真是可笑。您不需要任何花哨的应用程序、即时通讯工具等。使用此命令,您可以将音频发送到远程主机。

arecord -f cd -t raw | oggenc - -r | ssh <user>@<remotehost> mplayer -
Run Code Online (Sandbox Code Playgroud)

或者如果你更喜欢 ffmpeg

ffmpeg -f alsa -ac 1 -i hw:3 -f ogg - \
    | ssh <user>@<remotehost> mplayer - -idle -demuxer ogg
Run Code Online (Sandbox Code Playgroud)

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


如果你想要一部真正的电话:

上面的命令只针对一个方向。对于另一个方向,您必须启动另一个 ssh 会话。因此,要接收其他用户对您说的话,请使用

ssh <user>@<remotehost> 'arecord -f cd -t raw | oggenc - -r' | mplayer -
Run Code Online (Sandbox Code Playgroud)

或者如果你更喜欢 ffmpeg

ssh <user>@<remotehost> ffmpeg -f alsa -ac 1 -i hw:3 -f ogg - \
    | mplayer - -idle -demuxer ogg
Run Code Online (Sandbox Code Playgroud)

hw:3您要记录的 alsadevice在哪里(用 找到它arecord -l;您也可以使用设备名称,用 找到它arecord -L;在许多情况下,您可以使用以下命令列出的设备:arecord -L | grep sysdefault

更新

2018 年在我的 Fedora Linux 系统ffmpeg上没有包含 alsa 支持(在带有 Raspbian 的 RaspberryPi 系统上似乎是一样的)。但是有一个简单的解决方案,无需重新编译。只需arecord(alarecorder)的输出通过管道传输到 ffmpeg:

ssh <user>@<remotehost> 'arecord -f cd -D plughw:2 | ffmpeg -ac 1 -i - -f ogg -' \
    | mplayer - -idle -demuxer ogg
Run Code Online (Sandbox Code Playgroud)

您可以plughw:2通过在以下命令的输出中找到您的设备来获取输入设备:

arecord -l
Run Code Online (Sandbox Code Playgroud)

就我而言,我看到card0card2(我的网络摄像头带有麦克风)。所以我plughw:2card2.

更新 2(无 mplayer)

如果您没有或喜欢mplayerffplay(它是 的一部分ffmpeg),您可以使用:


con*_*tti 6

Erik 的答案效果很好,但是使用它的方式,使用flacor oggenc,存在显着的滞后。
一个解决方案是添加-cache 256mplayer命令中,所以它看起来如下:

ssh <user>@<remotehost> "arecord -f cd -D plughw:2 | oggenc -" | mplayer -cache 256 -
Run Code Online (Sandbox Code Playgroud)

另一件事要提到的是,现在几乎每个现代发行版都使用 PulseAudio,它控制硬件设备,因此plughw:2如果 PulseAudio 正在运行,使用将失败。
通常,default应该可以正常工作并使用 PulseAudio,您可以使用 PulseAudiopavucontrol或类似方法来选择所需的输入源。

这将使命令如下:

ssh <user>@<remotehost> "arecord -f cd | oggenc -" | mplayer -cache 256 -
Run Code Online (Sandbox Code Playgroud)

但是:这会导致滞后。在我的情况下,大约是八秒。这太可怕了。


该解决方案比任何其他命令都简单得多:

ssh <user>@<host> "arecord -f S16_LE -r 36000" | aplay
Run Code Online (Sandbox Code Playgroud)

就是这样。这几乎不使用任何 CPU(根据 0.1% htop)。它对我来说使用了 ~60KB/s 的带宽。

如果你想要立体声:ssh <user>@<host> "arecord -f cd" | aplay
只有在你有立体声麦克风时才有用,对我来说将带宽增加到 ~150KB/s。(因为它还将采样率提高到 44100Hz)。

可以在此处找到有关采样率 ( -r) 和比特率(受 影响-f)的更多信息。 基本上:你走得越低,质量越差,但所需的带宽越低。

此解决方案与 PulseAudio 完全兼容,您可以使用pactlpavucontrolGUI 应用程序控制输出设备、音量等:

控制