是否可以使用 Oboe 库同时打开 Android 中的 2 个麦克风?
Is it possible to open 2 microphones in Android at same time with Oboe library?
我正在尝试使用 google 的 Oboe 库为每个麦克风打开 2 个麦克风流:
oboe::AudioStreamBuilder builder;
builder.setChannelCount(channelCount)
->setDirection(isInput ? oboe::Direction::Input : oboe::Direction::Output)
->setSharingMode((oboe::SharingMode) sharingMode)
->setPerformanceMode((oboe::PerformanceMode) performanceMode)
->setInputPreset((oboe::InputPreset)inputPreset)
->setDeviceId(deviceId)
->setSessionId((oboe::SessionId) sessionId)
->setSampleRate(sampleRate)
->setFormat((oboe::AudioFormat) format)
->setChannelConversionAllowed(channelConversionAllowed)
->setFormatConversionAllowed(formatConversionAllowed)
->setSampleRateConversionQuality((oboe::SampleRateConversionQuality) rateConversionQuality)
;
oboe::AudioStream *oboeStream = nullptr;
oboe::Result result = builder.openStream(&oboeStream);
如您所见,deviceId 已传递给构建器。这是我通过一些 java 方法获得的麦克风 ID。我将 7 和 9 作为 id,用于内置麦克风和电话麦克风。问题是当我尝试启动 2 个流时:
oboeStream.requestStart()
我在第二个流中收到此错误:
E/AudioRecord: start() status -38
但如果我尝试只打开第一个,然后只打开第二个,在 2 个不同的版本中,一切正常。那么我不能用双簧管打开 2 个麦克风流是真的吗?看起来很强大的库,应该可以吧
事实上,即使您有两个麦克风,根据文档中的说明,也不可能同时有多个流,只有当我们谈论内部麦克风时,因为它们由同一个频道,如果我们谈论的是外部设备,那么有两个 input-output 频道,你可以有两个不同的流。
大多数时候,Android 不允许您从多个线程中捕获音频。您的 phone 有多少输入源或您使用哪个库都没有关系。您不能同时打开两个音频流。即使是两个独立的普通应用程序也不能同时访问输入源,如果您想在流源被另一个进程捕获时开始录制,则会返回错误。从 Android 10 起,发生了一些变化。根据文档:
Android 10 (API level 29) and higher imposes a priority scheme that
can switch the input audio stream between apps while they are running.
In most cases, if a new app acquires the audio input, the previously
capturing app continues to run, but receives silence. In some cases
the system can continue to deliver audio to both apps.
两个流意味着两个线程,就像两个不同的应用程序。在某些情况下,两个进程可以同时捕获音频,如下所示:
Assistant + ordinary app
Accessibility service + ordinary app
Voice call + ordinary app
有关详细信息,请阅读 Android 文档中的 this page。
我正在尝试使用 google 的 Oboe 库为每个麦克风打开 2 个麦克风流:
oboe::AudioStreamBuilder builder;
builder.setChannelCount(channelCount)
->setDirection(isInput ? oboe::Direction::Input : oboe::Direction::Output)
->setSharingMode((oboe::SharingMode) sharingMode)
->setPerformanceMode((oboe::PerformanceMode) performanceMode)
->setInputPreset((oboe::InputPreset)inputPreset)
->setDeviceId(deviceId)
->setSessionId((oboe::SessionId) sessionId)
->setSampleRate(sampleRate)
->setFormat((oboe::AudioFormat) format)
->setChannelConversionAllowed(channelConversionAllowed)
->setFormatConversionAllowed(formatConversionAllowed)
->setSampleRateConversionQuality((oboe::SampleRateConversionQuality) rateConversionQuality)
;
oboe::AudioStream *oboeStream = nullptr;
oboe::Result result = builder.openStream(&oboeStream);
如您所见,deviceId 已传递给构建器。这是我通过一些 java 方法获得的麦克风 ID。我将 7 和 9 作为 id,用于内置麦克风和电话麦克风。问题是当我尝试启动 2 个流时:
oboeStream.requestStart()
我在第二个流中收到此错误:
E/AudioRecord: start() status -38
但如果我尝试只打开第一个,然后只打开第二个,在 2 个不同的版本中,一切正常。那么我不能用双簧管打开 2 个麦克风流是真的吗?看起来很强大的库,应该可以吧
事实上,即使您有两个麦克风,根据文档中的说明,也不可能同时有多个流,只有当我们谈论内部麦克风时,因为它们由同一个频道,如果我们谈论的是外部设备,那么有两个 input-output 频道,你可以有两个不同的流。
Android 不允许您从多个线程中捕获音频。您的 phone 有多少输入源或您使用哪个库都没有关系。您不能同时打开两个音频流。即使是两个独立的普通应用程序也不能同时访问输入源,如果您想在流源被另一个进程捕获时开始录制,则会返回错误。从 Android 10 起,发生了一些变化。根据文档:
Android 10 (API level 29) and higher imposes a priority scheme that can switch the input audio stream between apps while they are running. In most cases, if a new app acquires the audio input, the previously capturing app continues to run, but receives silence. In some cases the system can continue to deliver audio to both apps.
两个流意味着两个线程,就像两个不同的应用程序。在某些情况下,两个进程可以同时捕获音频,如下所示:
Assistant + ordinary app
Accessibility service + ordinary app
Voice call + ordinary app
有关详细信息,请阅读 Android 文档中的 this page。