在Linux上共享麦克风音频流

时间:2020-08-22 22:53:17

标签: audio alsa pulseaudio jack libalsa

就我的情况而言,最重要的是开发可访问性应用程序,而不是进行任何形式的恶意窃听,而在此情况下,还存在各种隐含的研究和开发方案,所有这些都应从能够读取麦克风音频中受益匪浅通过多个同时运行不相关的流程进行流式传输,例如录制工具和/或我自己代码的不同版本。

问题陈述

我正在使用如下所示的高级python API读取麦克风输入流:

import sounddevice

audio_stream = sounddevice.InputStream(
  device=self.microphone_device,
  channels=max(self.channels),
  samplerate=self.audio_props['sample_rate'],
  blocksize=int(self.audio_props['frame_elements_size']),
  callback=self.audio_callback)

我想了解是否可以(在Linux上)同时将麦克风音频流读取到另一个程序(例如Google Meet / Zoom)来读取它。即有效地共享音频流。

与上述python包装器一样,在进行视频通话时启动上述代码也就不足为奇了:

Expression 'paInvalidSampleRate' failed in 
'src/hostapi/alsa/pa_linux_alsa.c', line: 2043 
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2716 
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' 
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2837

诚然,我还不太熟悉ALSA术语,并且总体上还没有Linux上的声音堆栈。

我的问题是,这可以直接使用ALSA库API或通过其他声音堆栈或声音系统配置直接完成吗?还是如果其他所有方法都不起作用,则通过代理程序/驱动程序将音频缓冲区暴露给多个使用者,而不会导致音频流延迟显着降低?

2 个答案:

答案 0 :(得分:5)

您可以直接通过ALSA执行此操作。 Dsnoop应该可以解决问题。它是ALSA附带的一个插件,可以共享输入流。

在我上面链接的页面中:

dsnoopdmix插件等效,但用于录制声音。 dsnoop插件允许多个应用程序同时从同一设备记录。

来自ALSA docs

如果要使用多个输入(捕获)客户端,则需要使用dsnoop插件:

您可以在此处四处寻找有关如何使用它的详细信息。 GitHub上的This问题也将帮助您入门,它详细介绍了如何配置dsnoop接口,以便您可以使用pyaudio从中进行读取。

更新

要配置ALSA,请使用以下内容(来自/etc/asound.conf的{​​{3}})编辑dsnoop

pcm.mixin {
         type dsnoop
         ipc_key 5978293 # must be unique for all dmix plugins!!!!
         ipc_key_add_uid yes
         slave {
                 pcm "hw:1,0"
                 channels 2
                 period_size 1024
                 buffer_size 4096
                 rate 44100
                 periods 0
                 period_time 0
         }
         bindings {
                 1 1
                 1 0
         }
 }

您可以测试一下您的配置是否可以使用以下功能:

arecord -d 30 -f cd -t wav -D pcm.mixin test.wav 

答案 1 :(得分:2)

所以,我猜这是一个音频问题,而不是python问题。 :) 根据API,流可以是设备专用的,也可以不是设备专用的。例如,用于专业音频的ASIO通常是设备专用的,因此只有一个应用程序(如DAW)可以访问它。例如,在Windows上,您可以按以下所示打开和关闭它:

https://help.ableton.com/hc/en-us/articles/209770485-Disabling-exclusive-mode-for-ASIO-interfaces

大多数python包(例如pyaudio等)都只是为portaudio提供绑定,这很繁琐,因此也请查看portaudio文档。 Portaudio可“组合”所有不同的API,例如ASIO,ALSA,WASAPI,Core Audio等。

要使ALSA同时创建多个Stream,您可能需要dmix,请查看以下Stackoverflow问题: https://unix.stackexchange.com/questions/355662/alsa-doesnt-work-when-multiple-applications-are-opened

相关问题