#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). Как достичь этой функциональности.