Android之 集成音视频通话

article/2025/10/13 5:59:24

一,背景

1.1 最近接收一个即时通讯二开项目,即时通讯部分用的XMPP协议,音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的开源框架。但客户想要微信那种页面的排版,后来经研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative写的,这样难度就大了,于是给了客户两套方案

方案一:继续使用jitsi-meet,这个就要重新下载完整源码,修改ReactNative,重新编译,然后上传私有仓库,打包库,再引入使用

方案二:另找一套可以修改UI的SDK,音视频相关SDK确实不少,但免费又能修改UI的就不好找了,后来客户同意用收费的,那就找下吧。

1.2  音视频通话框架整理

Jitsi 
Jitsi是一个开源的,安全(ZRTP加密),高质量的SIP/XMPP视频通话、会议、聊天、桌面共享、文件传传输。可以安装在你喜欢的操作系统中并且支持多种IM网络。
官方网站:https://jitsi.org/
总结:UI部分是用ReactNative 混合框架写的,改动难度大,第一步需要下载完整源码,第二部需要编译成功,第三步修改ReactNative UI源码  第四步需要上传仓库 第五步引用私服仓库库

https://github.com/jitsi/jitsi-maven-repository/tree/master/releases/org/jitsi/react/jitsi-meet-sdk
https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-android-sdk/
https://www.linuxrumen.com/rmxx/1794.html
https://github.com/jitsi/jitsi-meet-sdk-samples
https://jitsi.org/jitsi-meet/
https://jitsi.github.io/handbook/docs/releases
https://blog.csdn.net/heibai110/article/details/119153517


SIPDroid 
SIPDroid 是开源的,sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器)实现。NAT传输支持stun server.
官方网站:www.sipdroid.org/


Linphone
Linphone是一种开源的IP语音电话(或SIP电话),可以通过互联网与人们进行免费的语音,视频和文本即时通讯。它使用SIP协议(互联网电话的开放标准),可以与任何SIP VoIP运营商一起使用,包括一些免费的SIP音频/视频服务。
官方网站:www.linphone.org/


Imsdroid
基于doubango(Doubango 是一个基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架。该框架使用ANSCI-C编写,具有很好的可移植性。并且已经被设计成非常轻便且能有效的工作在低内存和低处理能力的嵌入式系统上。苹果系统上的idoubs功能就是基于此框架编写) .音视频编码格式大部分都支持(H264(video),VP8(video),iLBC(audio),PCMA,PCMU,G722,G729)。NAT支持ICE(stun+turn)
官方网站:https://github.com/DoubangoTelecom/imsdroid     http://www.doubango.org/


openfire
openfire是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
官方网站:http://www.igniterealtime.org/projects/openfire/


WebRTC
WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术。现在许多SDK都是使用WebRTC作为框架来实现。
官方网站: https://webrtc.org/

1.3  音视频通话SDK整理

AnyChat
视频模块是否独立: 是
Demo测试详情: 偶有马赛克以及声音有爆音
接入此SDK的其他厂商:一些银行,证券,PADROBOTD等
价格:标准版:6800元/平台 * N 企业版:36800元/平台 * N 旗舰版:56800元/平台 * N
并发:标准版:1980元/并发 * M 高版:9000元/并发 * M 服务器 618000元/台
官网: http://www.anychat.cn/
总结:比较庞大,价格也贵,服务器和客户端得一起用


JusTalk Cloud
视频模块是否独立: 是
Demo测试详情:效果较好,略有延迟
接入此SDK的其他厂商:360儿童机器人,360手表,春雨医生等
价格:一对一视频 0.039元 / 分钟
官网: http://www.justalkcloud.com/
总结:整体较好,可以修改UI,也能单独集成一对一,一对多,视频SDK

融云
视频模块是否独立: 否
Demo测试详情:效果一般般,偶尔卡顿
接入此SDK的其他厂商:悦跑,途家,优信等
价格:360P以下:0.008元/分钟 720P及以下:0.030元/分钟 720P以上:0.11元/分钟
官网: http://www.rongcloud.cn/  
文档: https://docs.rongcloud.cn/v3/views/rtc/call/ui/quick-start/android.html
总结:虽然不能单独集成,需要和IM基础库一起集成,但可以修改UI,也是不错的选择

QCloud
视频模块是否独立: 否
Demo测试详情:业界主流,效果较好,云服务稳定,集成相对于其他独立的稍稍麻烦些。
接入此SDK的其他厂商:
价格:日活少于10万免费(需与客服询问)
官网: http://www.qcloud.com

环信
视频模块是否独立: 否
Demo测试详情:偶尔有马赛克,比较普通
接入此SDK的其他厂商:猎聘等一些APP
价格:社区版(免费):0.023元/分钟   企业版(收费):0.020元/分钟
官网: http://www.easemob.com

网易云信
视频模块是否独立: 否
Demo测试详情:效果还行。
接入此SDK的其他厂商:科大讯飞、新东方、网易产品等
价格:功能费 1000 / 月 (1000分钟) + 0.025/分钟
官网: http://www.netease.im

agora.io 声网
视频模块是否独立: 是
Demo测试详情:主流的某些直播平台使用此SDK,效果较好,基本无卡顿
接入此SDK的其他厂商:小米,陌陌,途牛,乐视等
价格:360P以下:0.00099美元/分钟 720P及以下:0.00399美元/分钟 720P以上:0.01499美元/分钟
官网: http://cn.agora.io
总结:不能修改UI,想修改UI的可以放弃

容联云通信
视频模块是否独立: 是
Demo测试详情:易断开,连接上后有时卡顿,且视频质量模糊,效果不太好
接入此SDK的其他厂商:小米,百合
价格:免费
官网: http://www.yuntongxun.com/ 
总结:没找到下载SDK地方,但文档给出修改UI方法是,引入远程插件,覆盖activity


1.4 总结:

  • 考虑单独集成和UI可修改方面推荐JusTalkCloud,融云,和Jits这三个。JusTalkCloud可以单独集成并且修改UI,融云需要和基础IM库一起集成,也可以修改UI,Jitsi免费,是不能修改UI的,真要修改,得编译源码,难度比较大
  • 融云虽然要和基础通讯库一起集成(imlib,imkit,calllib,callkit),但其它单独继承的库流程是一样的,也要先注册账号,获取token才能使用。

二,融云音视频SDK的集成

2.1 集成融云音视频,需要同时集成imlib,imkit,calllib,callkit

dependencies {implementation 'cn.rongcloud.sdk:im_lib:5.4.0.2' // 即时通讯基础能力库implementation 'cn.rongcloud.sdk:im_kit:5.4.0.2' // 即时通讯 UI 基础组件implementation 'cn.rongcloud.sdk:call_lib:5.4.0' // 音视频呼叫能力库(内含 rtc_lib)implementation 'cn.rongcloud.sdk:call_kit:5.4.0' // 音视频通话能力 UI 组件
}

与老项目库可能会冲突,为了兼容老项目,可以本地集成

a0506001401a411399a6f1194592878e.png

 imkit库下面的引用

dependencies {api fileTree(dir: 'libs', include: ['*.jar'])api 'cn.rongcloud.sdk:im_lib:5.4.0'implementation 'com.github.bumptech.glide:glide:4.11.0'implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.fragment:fragment:1.2.5'implementation 'androidx.recyclerview:recyclerview:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'implementation "androidx.viewpager2:viewpager2:1.1.0-alpha01"implementation "androidx.documentfile:documentfile:1.0.1"implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'implementation "androidx.room:room-runtime:2.0.0"annotationProcessor "androidx.room:room-compiler:2.0.0"
}

 callkit库下面的引用

dependencies {api fileTree(dir: 'libs', include: ['*.jar'])api project(':imkit')api 'cn.rongcloud.sdk:call_lib:5.4.0'
}

冲突一:glide版本冲突

统一下版本,统一用高版本,但老项目得做兼容,把老的glide相关代码替换为新的glide支持

冲突二:androidx.lifecycle版本冲突,可以排除冲突的库

implementation ('cn.rongcloud.sdk:im_kit:5.4.0')
{exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime'exclude group: 'androidx.room', module: 'room-runtime'
}

冲突三:资源冲突,aapt这种也基本上是存在不同版本的库

9e8fefcb52a24a268b4192da968127fb.png

 定位冲突的地方,统一版本

c1716c6eaf7d4a16ab6d08d42e61666a.png

 三,融云音视频配置

3.1 初始化

RongIM.init(this, appKey);

这个地方要注意,要用IMKit库初始化,不能用IMLib初始化,不然页面显示方面会有问题,音视频黑屏没画面

//RongIMClient.init(this, appKey);

3.2 获取token

使用融云要先获取token,连接上融云服务后才能使用聊天功能,测试的话可以在融云平台生成临时token,正式需要后端接口配合。

82c5d4f6fd094d1db55b1881f8b3037e.png

 3.3 连接融云

//连接融云
RongIMClient.connect(token, new RongIMClient.ConnectCallback() {@Overridepublic void onSuccess(String userId) {}@Overridepublic void onError(RongIMClient.ConnectionErrorCode e) {}@Overridepublic void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) {}
});

3.4 连接成功之后同步用户信息

//同步用户信息,用于展示头像昵称
RongIM.setUserInfoProvider(new UserDataProvider.UserInfoProvider() {@Overridepublic UserInfo getUserInfo(String userId) {if(userId.equals(coreManager.getSelf().getUserId())){//同步方式同步信息String name = CoreManager.getSelf(MainActivity.this).getNickName();String portraitUri = AvatarHelper.getAvatarUrl(coreManager.getSelf().getUserId(), true);UserInfo userInfo = new UserInfo(userId, name, Uri.parse(portraitUri));return userInfo;}else {//异步方式同步用户信息,调取接口刷新本地用户缓存getOtherUserInfo(userId);return null;}}
}, true);

刷新用户缓存

User user = result.getData();
String name = user.getNickName();
String portraitUri = AvatarHelper.getAvatarUrl(user.getUserId(), true);
UserInfo userInfo = new UserInfo(user.getUserId(), name, Uri.parse(portraitUri));
RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);

3.5 调起语音通话

RongCallKit.startSingleCall(this, mFriend.getUserId(), RongCallKit.CallMediaType.CALL_MEDIA_TYPE_AUDIO);

3.6 监听语音通话

//监听语音通话状态
RongCallKit.setCustomerHandlerListener(new RongCallCustomerHandlerListener() {@Overridepublic List<String> handleActivityResult(int requestCode, int resultCode, Intent data) {return null;}@Overridepublic void addMember(Context context, ArrayList<String> currentMemberIds) {}@Overridepublic void onRemoteUserInvited(String userId, RongCallCommon.CallMediaType mediaType) {}@Overridepublic void onCallConnected(RongCallSession callSession, SurfaceView localVideo) {}/*** 通话结束。* 通话中,对方挂断,己方挂断,或者通话过程网络异常造成的通话中断,都会回调 ** @param callSession 通话实体。* @param reason      通话中断原因。*/@Overridepublic void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {if(callSession.getSelfUserId().equals(callSession.getCallerUserId())) {//通话时长int longTime=(int) (callSession.getEndTime() - callSession.getStartTime()) / 1000;if (callSession.getEndTime()>0){//挂断通话}else {//取消通话}}}@Overridepublic void onCallMissed(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {}
});


http://chatgpt.dhexx.cn/article/BrKYrKBV.shtml

相关文章

Unity实战篇 | 接入 声网SDK 实现 视频通话——自己动手做一个 视频通话

目录 🐱‍🏍前言🎂Unity 接入 声网SDK 实现 音视频通话第1️⃣步,创建声网应用第2️⃣步,获取相应的SDK第3️⃣步,将SDK接入Unity中第4️⃣步:搭建一个测试场景,编写测试代码第5️⃣步:视频通话API第6️⃣步:视频通话 效果测试🎂案例下载链接🎨总结🐱‍🏍

Android技术分享| 视频通话开发流程(二)

多人呼叫 多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫1个以上的人&#xff0c;中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似&#xff0c;但也有些区别&#xff0c;需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。 主叫 …

Web音视频通话解决方案 —— Agora Web SDK NG 版接入教程

引言 随着社会的发展&#xff0c;人们对实时音视频的需求越来越多。在线会议&#xff0c;电商直播&#xff0c;在线教育等相关产品不断涌现。但是对于个人开发者或者小团队来说&#xff0c;自己实现一个实时音视频服务并且要保障服务稳定&#xff0c;满足低延时等要求&#xf…

基于声网 SDK 实现 iOS 端的一对一视频通话

在很多产品&#xff0c;加入实时视频通话已经不是新鲜事情了&#xff0c;尤其是近几年的疫情影响&#xff0c;个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网…

web端视频通话sdk集成和功能实现流程(实时视频系列五)

本文介绍的是在wed端如何集成即构音视频SDK&#xff0c;以实现在wed端一对一&#xff0c;一对多及多人实时视频通话的功能。 一、SDK集成指引 1、安装 请从 jZego-RTC-SDK 下载 SDK。 npm下载包支持typescript语言(推荐)&#xff1a; npm i webrtc-zego 2、集成SDK 可使用s…

《保姆级教程》基于Agora SDK实现音视频通话及屏幕共享

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

前言 大家好&#xff0c;我是 小曾同学&#xff0c;小伙伴们也可以叫我小曾&#xff5e; 如果你想实现一对一音视频通话和屏幕共享功能&#xff0c;不妨来看看这篇文章&#xff0c;保姆级教程&#xff0c;不需要从零实现&#xff0c;直接集成声网 SDK 即可轻松上手。 本文也…

Android设备实现语音视频通话

一、背景 有智慧社区相关的项目&#xff0c;需要门禁开发门禁机APP以及用户端APP&#xff0c;要求实现门禁设备呼叫业主APP&#xff0c;业主接通后可以通话、可以开门。这里主要要做的就是语音和视频通话功能&#xff0c;以及远程开门。至于业务逻辑那就是正常的需求处理了。 …

基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

声网视频 SDK 被广泛应用于多种实时互动场景中&#xff0c;例如视频会议、视频通话、音视频社交、在线教育等。为了让刚刚接触声网 SDK 的开发者&#xff0c;可以更顺畅地实现基础的视频通话功能&#xff0c;我们基于声网 Web SDK 4.x 版本梳理了本篇教程。 在本文末&#xff0…

如何基于 Agora Android SDK 在应用中实现视频通话?

在很多产品&#xff0c;实时视频通话已经不是新鲜的功能了&#xff0c;例如视频会议、社交应用、在线教育&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频通话应用。声网 SDK 每个月会提供 10000 分钟的免…

Android uni-app实现音视频通话

前言 上一篇讲解了怎么实现Android uni-app封装原生插件&#xff0c;这篇讲解一下&#xff0c;把anyRTC的RTC&#xff08;音视频通讯&#xff09;封装uni-app 实现音视频通话。 不了解anyRTC的小伙伴&#xff0c;可以点击下面链接&#xff1a; 开发者官网 1.效果图 先上图&a…

使用 Agora SDK 开发 React Native 视频通话 App

在 React Native 的应用中&#xff0c;从头开始添加视频通话功能是很复杂的。要保证低延迟、负载平衡&#xff0c;还要注意管理用户事件状态&#xff0c;非常繁琐。除此之外&#xff0c;还必须保证跨平台的兼容性。 当然有个简单的方法可以做到这一点。在本次的教程中&#xf…

MySQL联合索引底层数据结构是怎样的

目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name&#xff0c;age&#xff0c;position三个字典进行一个联合索引&#xff0c;构建B树索引结构。 2.联合索引是如何进行排序的 B树…

MySQL联合索引在B+树如何存储以及寻址

文章目录 引入Innodb B树联合索引存储以及寻址总结 引入 最近找工作&#xff0c; 去一家三方支付公司面试&#xff0c;前面得过程还挺好&#xff0c;所有的提都回答对了&#xff08;心里暗自窃喜应该能拿到高工资offer&#xff0c;迎娶白富美&#xff0c;然后走向人生巅峰&…

MySQL联合索引生效规则

最近项目中一张表数量测试达到千万级别&#xff0c;考虑加索引&#xff0c;对于单列索引及联合索引&#xff08;复合索引&#xff09;简单学习了下&#xff0c;做一下笔记。 联合索引生效前提&#xff1a;因为联合索引有顺序讲究&#xff0c;联合索引的第一个字段是引导列&…

mysql联合索引的数据结构

一、本文主要讲解的内容有&#xff1a; 联合索引在B树上的存储结构联合索引的查找方式为什么会有最左前缀匹配原则 在分享这篇文章之前&#xff0c;我在网上查了关于MySQL联合索引在B树上的存储结构这个问题&#xff0c;翻阅了很多博客和技术文章&#xff0c;其中有几篇讲述的…

mysql联合索引有效和失效的情况分析

关于mysql的索引&#xff0c;是mysql优化一个非常重要的方面。那么关于索引是否有效就是非常关键了。很多人设计了索引&#xff0c;但是发现依旧很慢。那么这个时候就判断sql的索引执行情况非常重要了。网上有大量的博主也写过不少类似的文章&#xff0c;但是关于联合索引的具体…

MySQL联合索引(abc)命中规则

1.建表 mysql创建一张表&#xff0c;表名&#xff1a;‘test_models’ id列为 主键&#xff0c;int类型 &#xff0c;自增a,b,c,d,e 全部是int&#xff08;11&#xff09;为&#xff08;a,b,c&#xff09;添加一个联合索引 index_abc 执行语句&#xff1a; CREATE TABLE te…

mysql联合索引

mysql联合索引的使用 命名规则&#xff1a;表名_字段名 1、需要加索引的字段&#xff0c;要在where条件中 2、数据量少的字段不需要加索引 3、如果where条件中是OR关系&#xff0c;加索引不起作用 4、符合最左原则 以下是我的建表语句 CREATE TABLE test ( id int(11) uns…

mysql 联合索引结构与索引匹配原则

联合索引结构与索引匹配原则 最左前缀匹配原则&#xff1a;在MySQL建立联合索引时会遵守最左前缀匹配原则&#xff0c;即最左优先&#xff0c;在检索数据时从联合索引的最左边开始匹配。 要想理解联合索引的最左匹配原则&#xff0c;先来理解下索引的底层原理。索引的底层是一…