gpt4 book ai didi

voip - iOS pjsip 2.2 扬声器切换失败

转载 作者:行者123 更新时间:2023-12-04 11:38:30 32 4
gpt4 key购买 nike

在通话过程中,我尝试使用 pjsip 2.2 库在 iOS 设备上将语音从内部扬声器切换到扬声器。它返回 TRUE 作为成功,但在物理上它不会改变声音目标。

我使用下一个代码

- (BOOL)setLoud:(BOOL)loud {
if (loud) {
@try {

pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER;

pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}

}
@catch (NSException *exception) {
return NO;
}
} else {
@try {
pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;

pj_status_t pj_status = pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE,
&route, PJ_TRUE);
if (pj_status == PJ_SUCCESS) {
return YES;
}
else
{
return NO;
}
}
@catch (NSException *exception) {
return NO;
}
}
}

你能建议我们如何使这项工作?

最佳答案

随着 iOS 7 的推出,您现在应该使用 AVAudioSession 来处理任何音频管理。我花了很长时间才最终让它工作,但我终于弄清楚了为什么我的音频没有自动路由到我的 iPhone 扬声器的问题。问题是,当您接听电话时,pjsip 会自动覆盖我在接听电话之前执行的 AVAudioSessionPortOverride。要解决这个问题,您只需覆盖输出音频端口 接听电话。

为了使我的 VoIP 应用程序在后台模式下有效工作,我决定在名为 on_call_state 的自定义回调方法中处理音频路由。当调用状态改变时,这个方法 on_call_state 被 pjsip 调用。正如您在此处阅读的那样,http://www.pjsip.org/pjsip/docs/html/group__PJSIP__INV.htm ,当调用状态发生变化时,您可以检查许多不同的标志。我在这个例子中使用的状态是 PJSIP_INV_STATE_CONNECTING PJSIP_INV_STATE_DISCONNECTED .

PJSIP_INV_STATE_CONNECTING 当音频调用连接到另一个对等点时调用。

PJSIP_INV_STATE_DISCONNECTED 当音频调用与另一个对等端结束时调用。

static void on_call_state(pjsua_call_id call_id, pjsip_event *e)
{
pjsua_call_info ci;

PJ_UNUSED_ARG(e);

pjsua_call_get_info(call_id, &ci);
PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id,
(int)ci.state_text.slen,
ci.state_text.ptr));
if (ci.state == PJSIP_INV_STATE_CONNECTING) {
BOOL success;
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;

success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:&error];
if (!success) NSLog(@"AVAudioSession error setCategory: %@", [error localizedDescription]);

success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort: %@", [error localizedDescription]);

success = [session setActive:YES error:&error];
if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]);
} else if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {
BOOL success;
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;

success = [session setActive:NO error:&error];
if (!success) NSLog(@"AVAudioSession error setActive: %@", [error localizedDescription]);
}
}

关于voip - iOS pjsip 2.2 扬声器切换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369008/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com