При подключении наушников к устройству, звук идет через динамики устройства

R2D2

Member
В документации от производителя ОС работа с аудио фокусом не помечена как устаревшая. Других решений документация не предлагает, а мы можем использовать только то, что дает Google.
Ну вы даете, работа с аудиофокусом не устарала, устарели методы работы с аудиофокусом.
Вот даю ссылку:
This method was deprecated in API level 26. use abandonAudioFocusRequest(android.media.AudioFocusRequest)

Все равно большое спасибо, уже все сделали через

audioManager = Flashphoner.getAudioManager().getAudioManager();

AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();

audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(audioAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {

}
})
.build();
 

Max

Administrator
Staff member
В любом случае, контекст SDK заканчивается здесь
audioManager = Flashphoner.getAudioManager().getAudioManager();
Остальное - уже контекст приложения. Сам по себе SDK - только обертка над сигналингом и WebRTC библиотекой, поэтому о том, что именно будет происходить в приложении, он не знает.
Когда искали решение на уровне приложения, учитывали ваш случай с поддержкой старых версий Android, поэтому предложили решение с устаревшим, но работающим методом.
 

R2D2

Member
В любом случае, контекст SDK заканчивается здесь

Остальное - уже контекст приложения. Сам по себе SDK - только обертка над сигналингом и WebRTC библиотекой, поэтому о том, что именно будет происходить в приложении, он не знает.
Когда искали решение на уровне приложения, учитывали ваш случай с поддержкой старых версий Android, поэтому предложили решение с устаревшим, но работающим методом.
Что то все равно как то криво работает с БТ, пока не могу понять зависимости. То отрубается воспроизведение звуков, то стримов.
Подскажите, когда используем воспроизведение звуков из файлов и воспроизведение стримов, какой экземпляр AudioManager для воспроизведения звуков лучше использовать:
  • полученый из audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
  • либо из audioManager = Flashphoner.getAudioManager().getAudioManager();
 

R2D2

Member
Мы рассматриваем только вариант когда БТ подключен, с другими вариантами проблем нет

Flashphoner.getAudioManager().setUseBluetoothSco(false);
Flashphoner.getAudioManager().setUseSpeakerPhone(false);

На данный момент есть зависимость - воспроизодится стрим или нет. Если стрим воспроизводится - то звуки тоже в это время воспроизводятся, если стрим не воспроизводится то звуки не воспроизводятся.

Пока все упростил до Вашего варианта:
public void play(int res){
MediaPlayer mediaPlayer = MediaPlayer.create(context, res);
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener=new AudioManager.OnAudioFocusChangeListener() {//Запрашиваю аудиофокус
@Override
public void onAudioFocusChange(int focusChange) {
mediaPlayer.setVolume(1,1);
mediaPlayer.start();
}
};
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.release();
audioManager.abandonAudioFocus(audioFocusChangeListener);
}
});
audioManager.requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);//Возвращаю
}
 

Max

Administrator
Staff member
Flashphoner.getAudioManager().setUseBluetoothSco(false);
Flashphoner.getAudioManager().setUseSpeakerPhone(false);
Кажется, здесь должно быть
Code:
Flashphoner.getAudioManager().setUseBluetoothSco(true);
На данный момент есть зависимость - воспроизодится стрим или нет. Если стрим воспроизводится - то звуки тоже в это время воспроизводятся, если стрим не воспроизводится то звуки не воспроизводятся.
Уточните, пожалуйста: если Вы создаете и запускаете плеер до stream.play(), то звук из плеера не воспроизводится, а если после stream.play(), то звук из плеера играет?
 

R2D2

Member
Да конечно, стоит именно как у вас - ошибся при копировании
private void bluetoothConnected() {
Toast.makeText(context, context.getString(R.string.message_bt_headset_is_plugged), Toast.LENGTH_SHORT).show();
Flashphoner.getAudioManager().setUseBluetoothSco(true);
Flashphoner.getAudioManager().setUseSpeakerPhone(false);
}
 

R2D2

Member
Уточните, пожалуйста: если Вы создаете и запускаете плеер до stream.play(), то звук из плеера не воспроизводится, а если после stream.play(), то звук из плеера играет?
У нас могут быть разные ситуации.
В данном случае:
  • если stream.play() был вызван до mediaPlayer.start(); то слышно и стрим и звук из плейера (после завершения стрима, звуки из mediaPlayer - больше будут не слышны);
  • если mediaPlayer.start() до stream.play() - то звуки из медиа плейра не слышны;
 

R2D2

Member
никак не получается сделать чтобы все было слышно в любой момент времени в любой комбинации
 

Max

Administrator
Staff member
никак не получается сделать чтобы все было слышно в любой момент времени в любой комбинации
Этого можно добиться, если микшировать аудио из файла в поток на сервере. Но, если необходимо играть именно локальное аудио (например TTS), то такой вариант не подойдет. Если есть возможность вынести аудио на сервер, лучше микшировать.
полученый из audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
если использовать этот аудиоменеджер, звуки играют?
 

R2D2

Member
Этого можно добиться, если микшировать аудио из файла в поток на сервере. Но, если необходимо играть именно локальное аудио (например TTS), то такой вариант не подойдет. Если есть возможность вынести аудио на сервер, лучше микшировать.
Мы не можем, это делать по нескольком причинам:
1) не всегда стрим есть;
2) это вызовет задержку;
3) вызовет серьёзную нагрузку на сервер
4) необоснованную нагрузку на каналы клиента и сервера
 

R2D2

Member
если использовать этот аудиоменеджер, звуки играют?
нет не играют;
все таки я думаю что проблема не в аудиофокусе, а именно в переключении каналов
 

Max

Administrator
Staff member
Переоткрыли тикет WCS-3095, но в этот раз исследование, скорее всего, будет более длительным.
В качестве обходного варианта рекомендуем микшер, т.к. к задержкам это не приведет (микшер по умолчанию realtime), и нагрузку на сервер микширование только аудио дает в разы меньшую по сравнению с видео. Канали клиента трафиком без видео также нагружаются меньше.
 

R2D2

Member
Переоткрыли тикет WCS-3095, но в этот раз исследование, скорее всего, будет более длительным.
В качестве обходного варианта рекомендуем микшер, т.к. к задержкам это не приведет (микшер по умолчанию realtime), и нагрузку на сервер микширование только аудио дает в разы меньшую по сравнению с видео. Канали клиента трафиком без видео также нагружаются меньше.
К сожалению мы не можем, это претит идеологии приложения.
 

Max

Administrator
Staff member
Добрый день.
Установка атрибута AudioAttributes.USAGE_VOICE_COMMUNICATION для плеера решает проблему:
Code:
MediaPlayer music = MediaPlayer.create(getBaseContext(), R.raw.sound1);
music.setAudioAttributes(
       new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
            .build());
music.start();
AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        Log.d("AudioFocus,", "onAudioFocusChange="+focusChange);
        music.setVolume(1, 1);
    }
};
// Request audio focus for playback
int requestResult = Flashphoner.getAudioManager().getAudioManager().requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
Log.d("AudioFocus,", "requestResult="+requestResult);
// Abandon audio focus when playback complete
music.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        Flashphoner.getAudioManager().getAudioManager().abandonAudioFocus(audioFocusChangeListener);
    }
});
В этом случае и при старте плеера до проигрывания стрима, и после звуки из плеера и из стрима идут в гарнитуру.
 

R2D2

Member
Добрый день. Сделал проверку предложенного решения. К сожалению данное решение, не полностью решает проблемы с bt.
При подключенных bt наушниках и при установленных флагах

Flashphoner.getAudioManager().setUseBluetoothSco(true);
Flashphoner.getAudioManager().setUseSpeakerPhone(false);

Если идет воспроизведение удаленного стрима, то звук от стрима и от медиаплейера слышно в наушниках хорошо.
Однако, если воспроизведения удаленного стрима нет, то не слышно звуков от медаплейера.

Как только флаг Flashphoner.getAudioManager().setUseBluetoothSco(true) устанавливается - медиаплейер не слышно, до тех пор пока не подключится стрим. Соответственно при отключении стрима, медапрогрыватель тоже становится не слышно.

как то бы сделать - универсально, без костылей и танцев с бубном (установил флаг и все звуки не зависимо от наличия входящего стрима, идут через то устройство которое подключено и выбрано)
 
Last edited:

Max

Administrator
Staff member
Добрый день.
Попробуйте применить этот патч к примеру Media Devices и собрать его с Android SDK 1.1. Проверьте, воспроизводятся ли в примере указанные проблемы.
 

Just66

New Member
Добрый день, вижу есть решение для запуска звука на фоне со стримом для Андроида, есть ли подобное для iOS SDK?
Пока что если запускать то звук воспроизводится через верхний микронов - очень тихо, если менять категорию сессии получилось добиться выхода на динамики, но при этом стрим идет, а вот звук уже не записывается
Возможно у вас есть какое-то готовое решение?
Я увидел что при запуске стрима mode меняется на videoChat
 

Max

Administrator
Staff member
Добрый день.
Добрый день, вижу есть решение для запуска звука на фоне со стримом для Андроида, есть ли подобное для iOS SDK?
Нет, к сожалению, iOS такого не позволяет. Например, нельзя играть WebRTC поток одновременно с Youtube. Это касается как видео, так и аудио.
 
Top