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);

你可能感兴趣的:(iOS—开源Voip客户端Linphone)