Как получить данные mic, когда другие приложения используют Mic?

#java #android #audio #audio-streaming #audiorecord

#java #Android #Аудио #потоковое аудио #аудиозапись

Вопрос:

Совместное использование аудиовхода микрофона между несколькими приложениями в Android

Я столкнулся с этой проблемой во время работы над моим текущим приложением, в котором я хочу одновременно передавать звук с микрофона между двумя (может быть несколькими) приложениями.

Я попытался записать аудиоданные через AudioRecord класс

 audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC
, 44100, AudioFormat.CHANNEL_IN_STEREO
, AudioFormat.ENCODING_PCM_16BIT
,pcmBufferSize);
//for reading data 
private ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE); //define at class level
.
.
.
buffer.rewind();
audioRecord.read(buffer, buffer.remaining());
  

Проблема в том, что когда любое другое приложение начинает использовать mic, мы получаем молчащие пакеты.

Согласно официальной документации:

Android 10 (уровень API 29) и выше налагает схему приоритетов, которая может переключать входной аудиопоток между приложениями во время их работы. В большинстве случаев, если новое приложение получает аудиовход, ранее записанное приложение продолжает работать, но получает тишину. В некоторых случаях система может продолжать передавать аудио в оба приложения. Различные сценарии совместного использования описаны ниже.

Но я видел много приложений, использующих аудиовход без каких-либо проблем. Например, для масштабирования, когда выполняется вызов масштабирования, и я запускаю аудиомагнитофон, тогда оба приложения получают звук.(хотя интенсивность звука zoom уменьшается).

И еще один пример — Omlet Arcade, они могут записывать звук с микрофона, даже если доступ к микрофону предоставлен другим приложениям. Пример: допустим, я транслирую какую-то игру Battle Royale через Omlet Arcade, тогда мой звук может быть услышан моими товарищами по команде (в игре), а также людьми, которые смотрят мой видеопоток.

Итак, было бы действительно полезно, если бы сообщество stackoverflow могло направить меня к решению.

Ответ №1:

Не уверен, что вы посмотрели чуть ниже часть документации, которую вы процитировали, но в следующем разделе указано, почему некоторые приложения могут совместно использовать аудиовход:

Существует четыре основных сценария [совместного использования]:

  • Помощник обычное приложение
  • Служба специальных возможностей обычное приложение
  • Два обычных приложения
  • Голосовой вызов обычное приложение

Голосовой вызов обычное приложение:
Голосовой вызов активен, если режим звука, возвращаемый AudioManager.getMode() , является MODE_IN_CALL или MODE_IN_COMMUNICATION.
Android разделяет входной звук в соответствии с этими правилами:

  • Вызов всегда получает звук.
  • Приложение может перехватывать голосовой вызов, если это привилегированное (предустановленное) приложение с разрешением CAPTURE_AUDIO_OUTPUT.
  • Приложение может записывать аудио, если это служба специальных возможностей.

Чтобы перехватить восходящий канал голосового вызова (TX), нисходящий канал (RX) или оба, приложение должно указать источники звука MediaRecorder.AudioSource.VOICE_UPLINK или MediaRecorder.AudioSource.VOICE_DOWNLINK и / или устройство AudioDeviceInfo.TYPE_TELEPHONY .

Далее снова указывается, как вы можете установить уровень конфиденциальности в Android 11 для записанного звука, например, установка значения «нечувствительный» позволяет передавать звук другим приложениям. Надеюсь, это поможет понять, с чего начать

Комментарии:

1. Я из той же команды, что и @ tkhurana96 , и мы ищем не конкретную ситуацию с регистратором вызовов / голосовым вызовом, а вместо двух обычных приложений. В настоящее время, если вы транслируете с помощью Omlet Arcade (приложение 1) и запускаете PubG (приложение 2), и у вас включен микрофон в PubG, и вы говорите что-нибудь, тогда и PubG, и Omlet Arcade получают этот звук (ваши товарищи по команде могут слышать вас в PubG, а ваши стримеры могут слышать вас в вашем потоке на YouTube или на любой платформе, на которую вы транслируете с помощью Omlet Arcade). Как достичь этой функциональности.