![如何监控麦克风输入?](https://linux22.com/image/180668/%E5%A6%82%E4%BD%95%E7%9B%91%E6%8E%A7%E9%BA%A6%E5%85%8B%E9%A3%8E%E8%BE%93%E5%85%A5%EF%BC%9F.png)
如何在 Linux 中监控麦克风输入?
注意:监听与录制和播放录制内容不同。
在Windows中,我可以通过以下方式收听自己的麦克风:
使用某些程序,它将捕获我的麦克风并将其发送到我的声卡进行播放。例如,使用
ffplay
命令ffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
它将产生显着的延迟,最多可达几秒钟。
使用输入设备属性的“监听”选项
它将产生较小的延迟,最多一秒。
带声卡小部件
它将产生零延迟。我认为,这将使输入声音在不离开声卡的情况下输出,但不确定。
我需要 Linux 命令行中的选项#2。
答案1
您应该能够使用 PulseAudio 监控您的麦克风环回模块。模块应自动为可用输入设备创建环回输出。手动加载模块
pactl load-module module-loopback
要使更改持久,请/etc/pulse/default.pa
附加
load-module module-loopback
答案2
如果您有模拟输入和模拟输出,我建议仅使用pavucontrol
(PulseAudio Volume Control)将输入音频路由到混音器的输出。但是,如果您有 USB 麦克风,则不能只是混合音频,而是某些软件必须录制音频,然后将其播放到输出流。根据您的硬件,此录制+播放可能会导致一些(甚至高)延迟。
你可以试试这个:
首先获取您要使用的输入和输出的名称:
$ pactl list short | egrep "alsa_(input|output)" | fgrep -v ".monitor"
对我来说,结果如下所示:
0 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
0 alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono module-alsa-card.c s16le 1ch 44100Hz SUSPENDED
这意味着我的输出设备被称为alsa_output.pci-0000_00_1b.0.analog-stereo
,我的 USB 网络摄像头/麦克风被称为alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono
。
我现在可以录制 USB 麦克风并将其输出到音频输出,如下所示:
$ pacat -r --latency-msec=1 -d alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono | pacat -p --latency-msec=2 -d alsa_output.pci-0000_00_1b.0.analog-stereo
也就是说,一个pacat
进程从麦克风读取数据并请求音频堆栈尝试将延迟降至 1 毫秒或 0.001 秒。另一个pacat
进程将音频写入我的输出设备,并尝试将延迟降至 2 毫秒或 0.002 秒。您也可以尝试将输出延迟减少到 1 毫秒,但至少对于我相当旧的硬件来说,在这种情况下音频剪辑有点太容易了。
但是,如果我长时间保持这种录制和播放输出的组合运行,那么延迟似乎会随着时间的推移而缓慢增加。我猜测我的 USB 麦克风时钟比输出音频时钟稍快,这导致缓冲区缓慢增加。我不知道有什么好方法可以让这些 pactl 进程跳过音频以保持输出实时。我想我需要为此编写一个自定义应用程序。
对于上述管道,在使用启用了 PREEMPT 的 Linux 内核(例如 Ubuntu内核)pacat ... | pacat
时,我的硬件的最佳情况延迟似乎是从声波撞击麦克风到从输出扬声器发出的声波大约 6 毫秒。linux-lowlatency