Управление микрофоном/звуком для iOS sdk

Ivan Balychev

New Member
1. При вызове функции play (FPWCSApi2Stream) происходит запрос разрешения NSMicrophoneUsageDescription
- на форуме был подобный вопрос, однако ответ в том обсуждении - убрать из plist этот пермишн и все, однако:
- - при отсутствии данного ключа в info.plist происходит краш приложения (нужно тестировать на реальном устройстве, а не на симуляторе (так как на симуляторе пермишны не запрашивает))
-- для проверки можно использовать таргет Player из wcs-ios-sdk-samples (там так же есть данный краш при отсутствии пермишна)
- не очень логично и не понятно для пользователей, зачем им давать доступ к микрофону для проигрывания стрима
- причем запрос на пермишн выполняется асинхронно с проигрывает стрима и разрешение/отмена никак не влияют на проигрывание стрима
Все что видно по стеку вызовов - это происходит в точке

#7 0x0000000102857408 in -[FPWCSApi2MediaConnection setRemoteSdp:] at /Users/admin/buildAgent/work/60b3db7bf9c69be9/sdk/fp_wcs_api2/FPWCSApi2/FPWCSApi2/FPWCSApi2WebRTCMediaProvider.m:350

2. Невозможно полностью выключить звук стрима с помощью контролов звука на телефоне (при использовании хардварных кнопок телефона, звук уменьшается до 10% процентов и ниже не устанавливается, то есть нельзя уменьшить звук до 0) - данная проблема есть и в Android SDK
@Max Будем благодарны за помощь.
 
Last edited:

Max

Administrator
Staff member
Добрый день.
В наших тестах в примере Player с последней сборкой iOS SDK 2.6.8 приложение не крашится при удалении разрешений NSMicrophoneUsageDescription и NSCameraUsageDescription из Player/Info.plist на iOS 12.4.9. На iOS 14.0.1 краш воспроизводится. Мы создали тикет WCS-3008, чтобы исследовать эту проблему.
По поводу управления звуком при воспроизведении на iOS создали тикет WCS-3009. О результатах по тикетам сообщим в этой теме.
Что касается Android SDK, в примере Media Devices показано, как использовать функцию Flashphoner.setVolume() при обработке нажатий на аппаратные кнопки
Java:
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        int currentVolume = Flashphoner.getVolume();
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (currentVolume == 1) {
                    Flashphoner.setVolume(0);
                }
                mPlayVolume.setProgress(currentVolume-1);
                break;
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (currentVolume == 0) {
                    Flashphoner.setVolume(1);
                }
                mPlayVolume.setProgress(currentVolume+1);
                break;
        }
        return super.onKeyDown(keyCode, event);
    }
Это работает в последних сборках Android SDK 1.1
 

Max

Administrator
Staff member
Добрый день.
Проблема с запросом доступа к микрофону в примере Player на iOS 14 (тикет WCS-3008) исправлена в сборке iOS SDK 2.6.10.
 

Ivan Balychev

New Member
@Max Добрый день.
Есть ли результат по тикету (WCS-3009) - управление уровнем звука стрима с помощью системных кнопок в iPhone?
 

Max

Administrator
Staff member
Добрый день.
Тикет WCS-3009 находится в работе, мы известим о результатах в этой теме.
 

Max

Administrator
Staff member
Добрый день.
В iOS приложении из-за упоминаемого здесь бага 17292753 невозможно уменьшить громкость воспроизведения аппаратными кнопками до нуля. Чтобы заглушить звук при воспроизведении, начиная со сборки 2.6.26 добавлены методы для отключения и включения звука, и приведен пример обхода данного бага в коде приложения Player. Подробнее см здесь.
 

Just66

New Member
Оч интересно, я немного показался и нашел другой способ как это обойти
после play()
try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .moviePlayback, policy: .default, options: .duckOthers)
ну это конечно подходит только для проигрывания
Есть другой вопрос, почему во время проигрывания вызывается микрофон?
 

Max

Administrator
Staff member
В последних сборках iOS SDK в примере Player микрофон не запрашивается, если соответствующий permission не указан явно в Info.plist приложения. Однако, если поток играть в примере, предназначенном в том числе для публикации (и в Info.plist есть микрофон), то запрос доступа к микрофону будет, даже если проигрывание начато раньше публикации.
 

Just66

New Member
А как можно явно указать потоку что он только для проигрывания?
В приложении просто есть возможность как публиковать так и смотреть, поэтому без permission никак
 

Max

Administrator
Staff member
А как можно явно указать потоку что он только для проигрывания?
Для объекта WCSStream вызываются либо publish(), либо play().
В приложении просто есть возможность как публиковать так и смотреть, поэтому без permission никак
В таком случае запрос никак не обойти
 
Top