Удаленное аудио не подключается: iOS, PJSIP 2.6, CallKit, PJSUA2

Я обновляю существующее приложение iOS VOIP для использования CallKit с PJSIP 2.6 и PJSUA2.

После некоторых усилий реализация CallKit работает, как и ожидалось. Входящие вызовы могут быть приняты или отклонены, и если они будут приняты, они будут связаны и контролироваться с помощью встроенного в приложение активного контроллера просмотра вызовов.

Однако звук, похоже, не подключен должным образом на конце pjsip. Нет звука, входящего или исходящего от удаленного вызывающего абонента. Звук микрофона, кажется, направляется обратно на динамик iPhone.

Аудиопорты SIP должны подключаться в функции обратного вызова onCallMediaState:

виртуальная пустота onCallMediaState(OnCallMediaStateParam &prm) {

    CallInfo ci = getInfo();
    AudioMedia* audio_media = 0;
    for (unsigned i = 0; i < ci.media.size(); i++) {
        if (ci.media[i].type==PJMEDIA_TYPE_AUDIO && ( ci.media[i].status == PJSUA_CALL_MEDIA_ACTIVE ||
            ci.media[i].status ==PJSUA_CALL_MEDIA_REMOTE_HOLD)) {
            try {
                audio_media = static_cast<AudioMedia*>(getMedia(i));
                if(audio_media != 0)
                {    
                    Endpoint::instance().audDevManager().getCaptureDevMedia().startTransmit(*audio_media);
                    audio_media->startTransmit(Endpoint::instance().audDevManager().getPlaybackDevMedia());
                }
            } catch (std::exception ex) {
                continue;
            }
        }
    }
}

Как описано в билете № 1941 по адресу: https://trac.pjsip.org/repos/ticket/1941:

  1. Я установил аудиоустройства, используя:

    ep->audDevManager().setNullDev();

сразу после инициализации класса Endpoint (ep->libInit(epConfig);), а затем:

  1. Я пытаюсь настроить устройства с помощью pjsua_set_snd_dev() в функции didActivate CXProvider, например:

-(void) setSipSoundDevices {

    pj_status_t status;
    int captDev, playDev;
    pjsua_get_snd_dev(&captDev, &playDev);
    Endpoint::instance().audDevManager().setPlaybackDev(playDev);
    Endpoint::instance().audDevManager().setCaptureDev(captDev);
}

pjsua_get_snd_dev(&captDev, &playDev) возвращает -99, -99 и звук не подключается.

Мой вопрос заключается в следующем. Как правильно подключить удаленные источники звука или порты при входящем вызове с помощью PJSIP 2.6 и CallKit?

Может ли 2.5.5 работать лучше в этом отношении?

Любые идеи приветствуются.


person FryAnEgg    schedule 26.06.2017    source источник
comment
Вы нашли решение этой проблемы. Я тоже сейчас столкнулся с той же проблемой. После приема входящего вызова звук на обоих концах не воспроизводится.   -  person Nandhakumar Kittusamy    schedule 27.07.2017
comment
У меня гораздо лучше получается подключать звук как для входящих, так и для исходящих вызовов. Нет простого ответа, как, но я сделал несколько вещей, которые постепенно помогли. 1) Я собрал и пересобрал библиотеки PJSIP 2.6. PJSUA вообще не должен обрабатывать AudioSession (например, документы PJSIP и CallKit). Однако это привело к сбоям и сбоям, связанным со звуком, в примере кода CallKit. 2) Я установил модуль «pjsip» и заменил некоторые библиотеки, связанные со звуком (на ум приходит webrtc), на те, которые я создал сам. 3) Я переделал много кода CallKit, пока звук не начал подключаться.   -  person FryAnEgg    schedule 31.07.2017
comment
Я все еще сталкиваюсь с проблемой: 1) звук входящего вызова не подключается в первый раз после запуска приложения, а исходящие вызовы подключаются нормально. 2) исходящие вызовы не разъединяются без экрана «Call Failed» и 3) аудио не переподключается после прерывания звонка оператором, который отклоняется после «Hold and Accept».   -  person FryAnEgg    schedule 31.07.2017
comment
как запустить звук, когда пользователь нажимает кнопку ответа на экране callkit. Не могли бы вы объяснить это. В моем случае callkit работает как другое приложение... во время звонка мое приложение уходит в фоновый режим. Затем пользователь нажимает кнопку ответа, звук не работает, потому что мое приложение ушло в фоновый режим.   -  person Nandhakumar Kittusamy    schedule 31.07.2017
comment
В моем случае исходящий вызов работает отлично, потому что я использую отдельный контроллер представления. Я только что добавил разрешение для микрофона в файле info.plist. Для удержания и отмены есть метод в pjsip. Пожалуйста, проверьте его и исправьте.   -  person Nandhakumar Kittusamy    schedule 31.07.2017


Ответы (1)


Постепенно я получил звук входящего вызова, работающий правильно. Суть дела заключалась в том, что, несмотря на то, что в документации как Apple, так и SIP говорится, что звук должен обрабатываться на стороне iOS, вам все равно нужно установить аудиоустройства SIP на уровне SIP в делегате провайдера 'didActivate' и функции 'didDeactivate'. Поскольку я использую слой PJSUA C++, мне пришлось детализировать связующий слой objc-c++, чтобы обеспечить эту функциональность. т.е.

-(void) activateSipSoundDevices {
    pj_status_t status = pjsua_set_snd_dev(0, 0);
}

-(void) deactivateSipSoundDevices {
    pj_status_t status = pjsua_set_null_snd_dev();
}

При инициализации учетной записи SIP обязательно установите нулевые звуковые устройства, например:

ep->audDevManager().setNullDev();

Надеюсь это поможет.

person FryAnEgg    schedule 03.12.2018
comment
Привет, подскажи, пожалуйста, как ты получаешь входящие звонки, когда приложение убито? Получает ли приложение какой-либо сигнал (не push), и мы можем зафиксировать это в методе входящего делегата callkit? - person Paresh. P; 12.07.2019