iOS—开源Voip客户端Linphone
Linphone一个免费开源的SIP客户端,iOS、Android、windows、mac、linux都支持。
其功能有语音、视频、拨打网络电话、即时通讯、多人会议。
iOS集成文档:
https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Getting%20started/iOS/
用cocoapods方式集成下载会很慢,可以直接下载他的SDK拉进项目。
https://gitlab.linphone.org/BC/public/podspec.git
选择一个版本打开linphone-sdk.podspec ,底部s.source里面就是资源链接
0.png把SDK拖进项目后跑起来会报错,原因是无法加载动态库,所以要把库拉改成静态库
1.png注意:linphonesw 这个框架是swift用的OC不需要导入
这些框架大部分都是用C语言写的,我们需要参考官方demo,抽取重要的方法,由于demo中的UI和功能代码是写在一起的,所以我们只能抽取总结重要的代码。最终获得了只有功能部分的LinphoneManager类,之后使用起来方法太多,我又封装了一个DMLinphoneManager,以下是DEMO。
这些框架大部分都是用C语言写的,我们需要参考官方demo,抽取重要的方法,由于demo中的UI和功能代码是写在一起的,所以我们只能抽取总结重要的代码。最终获得了只有功能部分的LinphoneManager类,之后使用起来方法太多,我又封装了一个DMLinphoneManager。
需要注意的点:
- 设置音频格式:可以设置多种格式,客户端会根据服务器的支持情况进行选择
#pragma mark - 设置音频编码格式
- (void)synchronizeCodecs:(const MSList *)codecs {
PayloadType *pt;
const MSList *elem;
for (elem = codecs; elem != NULL; elem = elem->next) {
pt = (PayloadType *)elem->data;
NSString *sreung = [NSString stringWithFormat:@"%s", pt->mime_type];
NSString *normalBt = [NSString stringWithFormat:@"%d",pt->clock_rate];
if ([sreung isEqualToString:@"speex"]
||[sreung isEqualToString:@"PCMU"]
||[sreung isEqualToString:@"PCMA"]) {
linphone_core_enable_payload_type(LC,pt, YES);
}
else
{
linphone_core_enable_payload_type(LC, pt, 0);
}
bool_t abool = linphone_core_payload_type_enabled(LC, pt);
NSLog(@"编码:%@,状态:%hhu",sreung,abool);
}
}
-
关于音频编码的对比 :https://blog.csdn.net/houqi1993/article/details/50504045?winzoom=1
2.png
-
设置随机端口号:
//部分手机本身端口问题 设置随机端口号
LinphoneSipTransports transportValue = {-1, -1, -1, -1};
linphone_core_set_sip_transports(LC, &transportValue);
- linphone启动会自动注册上服务器,根据业务需要用完需要清空配置信息
[[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"pushnotification_preference"];
LinphoneSipTransports transportValue = {-1, -1, -1, -1};
if (linphone_core_set_sip_transports(LC, &transportValue)) {
NSLog(@"cannot set transport");
}
[[LinphoneManager instance] lpConfigSetString:@"" forKey:@"sharing_server_preference"];
[[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"ice_preference"];
[[LinphoneManager instance] lpConfigSetString:@"" forKey:@"stun_preference"];
linphone_core_set_stun_server(LC, NULL);
linphone_core_set_nat_policy(LC, NULL);
linphone_core_clear_all_auth_info(LC);
linphone_core_clear_proxy_config(LC);
linphone_core_clear_call_logs(LC);