一,背景
1.1 最近接收一個(gè)即時(shí)通訊二開(kāi)項(xiàng)目,即時(shí)通訊部分用的XMPP協(xié)議,音視頻則是集成的國(guó)外的開(kāi)源免費(fèi)庫(kù)jitsi-meet-sdk-2.4.0-4.aar,是基于WebRTC的開(kāi)源框架。但客戶(hù)想要微信那種頁(yè)面的排版,后來(lái)經(jīng)研究jitsi是不能修改UI的,UI部分是用混合框架ReactNative寫(xiě)的,這樣難度就大了,于是給了客戶(hù)兩套方案
方案一:繼續(xù)使用jitsi-meet,這個(gè)就要重新下載完整源碼,修改ReactNative,重新編譯,然后上傳私有倉(cāng)庫(kù),打包庫(kù),再引入使用
方案二:另找一套可以修改UI的SDK,音視頻相關(guān)SDK確實(shí)不少,但免費(fèi)又能修改UI的就不好找了,后來(lái)客戶(hù)同意用收費(fèi)的,那就找下吧。
1.2??音視頻通話框架整理
Jitsi?
Jitsi是一個(gè)開(kāi)源的,安全(ZRTP加密),高質(zhì)量的SIP/XMPP視頻通話、會(huì)議、聊天、桌面共享、文件傳傳輸??梢园惭b在你喜歡的操作系統(tǒng)中并且支持多種IM網(wǎng)絡(luò)。
官方網(wǎng)站:https://jitsi.org/
總結(jié):UI部分是用ReactNative 混合框架寫(xiě)的,改動(dòng)難度大,第一步需要下載完整源碼,第二部需要編譯成功,第三步修改ReactNative UI源碼 ?第四步需要上傳倉(cāng)庫(kù) 第五步引用私服倉(cāng)庫(kù)庫(kù)
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 是開(kāi)源的,sip協(xié)議棧使用JAVA實(shí)現(xiàn),音頻Codec使用skype的silk(Silk編解碼是Skype向第三方開(kāi)發(fā)人員和硬件制造商提供免版稅認(rèn)證(RF)的Silk寬帶音頻編碼器)實(shí)現(xiàn)。NAT傳輸支持stun server.
官方網(wǎng)站:www.sipdroid.org/
Linphone
Linphone是一種開(kāi)源的IP語(yǔ)音電話(或SIP電話),可以通過(guò)互聯(lián)網(wǎng)與人們進(jìn)行免費(fèi)的語(yǔ)音,視頻和文本即時(shí)通訊。它使用SIP協(xié)議(互聯(lián)網(wǎng)電話的開(kāi)放標(biāo)準(zhǔn)),可以與任何SIP VoIP運(yùn)營(yíng)商一起使用,包括一些免費(fèi)的SIP音頻/視頻服務(wù)。
官方網(wǎng)站:www.linphone.org/
Imsdroid
基于doubango(Doubango 是一個(gè)基于3GPP IMS/RCS 并能用于嵌入式和桌面系統(tǒng)的開(kāi)源框架。該框架使用ANSCI-C編寫(xiě),具有很好的可移植性。并且已經(jīng)被設(shè)計(jì)成非常輕便且能有效的工作在低內(nèi)存和低處理能力的嵌入式系統(tǒng)上。蘋(píng)果系統(tǒng)上的idoubs功能就是基于此框架編寫(xiě)) .音視頻編碼格式大部分都支持(H264(video),VP8(video),iLBC(audio),PCMA,PCMU,G722,G729)。NAT支持ICE(stun+turn)
官方網(wǎng)站:https://github.com/DoubangoTelecom/imsdroid ? ? http://www.doubango.org/
openfire
openfire是開(kāi)源的、基于可拓展通訊和表示協(xié)議(XMPP)、采用Java編程語(yǔ)言開(kāi)發(fā)的實(shí)時(shí)協(xié)作服務(wù)器。 Openfire安裝和使用都非常簡(jiǎn)單,并利用Web進(jìn)行管理。單臺(tái)服務(wù)器可支持上萬(wàn)并發(fā)用戶(hù)。
官方網(wǎng)站:http://www.igniterealtime.org/projects/openfire/
WebRTC
WebRTC,名稱(chēng)源自網(wǎng)頁(yè)實(shí)時(shí)通信(Web Real-Time Communication)的縮寫(xiě),是一個(gè)支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音對(duì)話或視頻對(duì)話的技術(shù)?,F(xiàn)在許多SDK都是使用WebRTC作為框架來(lái)實(shí)現(xiàn)。
官方網(wǎng)站: https://webrtc.org/
1.3??音視頻通話SDK整理
AnyChat
視頻模塊是否獨(dú)立: 是
Demo測(cè)試詳情: 偶有馬賽克以及聲音有爆音
接入此SDK的其他廠商:一些銀行,證券,PADROBOTD等
價(jià)格:標(biāo)準(zhǔn)版:6800元/平臺(tái) * N 企業(yè)版:36800元/平臺(tái) * N 旗艦版:56800元/平臺(tái) * N
并發(fā):標(biāo)準(zhǔn)版:1980元/并發(fā) * M 高版:9000元/并發(fā) * M 服務(wù)器 618000元/臺(tái)
官網(wǎng): http://www.anychat.cn/
總結(jié):比較龐大,價(jià)格也貴,服務(wù)器和客戶(hù)端得一起用
JusTalk Cloud
視頻模塊是否獨(dú)立: 是
Demo測(cè)試詳情:效果較好,略有延遲
接入此SDK的其他廠商:360兒童機(jī)器人,360手表,春雨醫(yī)生等
價(jià)格:一對(duì)一視頻 0.039元 / 分鐘
官網(wǎng): http://www.justalkcloud.com/
總結(jié):整體較好,可以修改UI,也能單獨(dú)集成一對(duì)一,一對(duì)多,視頻SDK
融云
視頻模塊是否獨(dú)立: 否
Demo測(cè)試詳情:效果一般般,偶爾卡頓
接入此SDK的其他廠商:悅跑,途家,優(yōu)信等
價(jià)格:360P以下:0.008元/分鐘 720P及以下:0.030元/分鐘 720P以上:0.11元/分鐘
官網(wǎng): http://www.rongcloud.cn/ ?
文檔: https://docs.rongcloud.cn/v3/views/rtc/call/ui/quick-start/android.html
總結(jié):雖然不能單獨(dú)集成,需要和IM基礎(chǔ)庫(kù)一起集成,但可以修改UI,也是不錯(cuò)的選擇
QCloud
視頻模塊是否獨(dú)立: 否
Demo測(cè)試詳情:業(yè)界主流,效果較好,云服務(wù)穩(wěn)定,集成相對(duì)于其他獨(dú)立的稍稍麻煩些。
接入此SDK的其他廠商:
價(jià)格:日活少于10萬(wàn)免費(fèi)(需與客服詢(xún)問(wèn))
官網(wǎng): http://www.qcloud.com
環(huán)信
視頻模塊是否獨(dú)立: 否
Demo測(cè)試詳情:偶爾有馬賽克,比較普通
接入此SDK的其他廠商:獵聘等一些APP
價(jià)格:社區(qū)版(免費(fèi)):0.023元/分鐘 ? 企業(yè)版(收費(fèi)):0.020元/分鐘
官網(wǎng): http://www.easemob.com
網(wǎng)易云信
視頻模塊是否獨(dú)立: 否
Demo測(cè)試詳情:效果還行。
接入此SDK的其他廠商:科大訊飛、新東方、網(wǎng)易產(chǎn)品等
價(jià)格:功能費(fèi) 1000 / 月 (1000分鐘) + 0.025/分鐘
官網(wǎng): http://www.netease.im
agora.io 聲網(wǎng)
視頻模塊是否獨(dú)立: 是
Demo測(cè)試詳情:主流的某些直播平臺(tái)使用此SDK,效果較好,基本無(wú)卡頓
接入此SDK的其他廠商:小米,陌陌,途牛,樂(lè)視等
價(jià)格:360P以下:0.00099美元/分鐘 720P及以下:0.00399美元/分鐘 720P以上:0.01499美元/分鐘
官網(wǎng): http://cn.agora.io
總結(jié):不能修改UI,想修改UI的可以放棄
容聯(lián)云通信
視頻模塊是否獨(dú)立: 是
Demo測(cè)試詳情:易斷開(kāi),連接上后有時(shí)卡頓,且視頻質(zhì)量模糊,效果不太好
接入此SDK的其他廠商:小米,百合
價(jià)格:免費(fèi)
官網(wǎng): http://www.yuntongxun.com/?
總結(jié):沒(méi)找到下載SDK地方,但文檔給出修改UI方法是,引入遠(yuǎn)程插件,覆蓋activity
1.4 總結(jié):
- 考慮單獨(dú)集成和UI可修改方面推薦JusTalkCloud,融云,和Jits這三個(gè)。JusTalkCloud可以單獨(dú)集成并且修改UI,融云需要和基礎(chǔ)IM庫(kù)一起集成,也可以修改UI,Jitsi免費(fèi),是不能修改UI的,真要修改,得編譯源碼,難度比較大
- 融云雖然要和基礎(chǔ)通訊庫(kù)一起集成(imlib,imkit,calllib,callkit),但其它單獨(dú)繼承的庫(kù)流程是一樣的,也要先注冊(cè)賬號(hào),獲取token才能使用。
二,融云音視頻SDK的集成
2.1 集成融云音視頻,需要同時(shí)集成imlib,imkit,calllib,callkit
dependencies {
implementation 'cn.rongcloud.sdk:im_lib:5.4.0.2' // 即時(shí)通訊基礎(chǔ)能力庫(kù)
implementation 'cn.rongcloud.sdk:im_kit:5.4.0.2' // 即時(shí)通訊 UI 基礎(chǔ)組件
implementation 'cn.rongcloud.sdk:call_lib:5.4.0' // 音視頻呼叫能力庫(kù)(內(nèi)含 rtc_lib)
implementation 'cn.rongcloud.sdk:call_kit:5.4.0' // 音視頻通話能力 UI 組件
}
與老項(xiàng)目庫(kù)可能會(huì)沖突,為了兼容老項(xiàng)目,可以本地集成
?imkit庫(kù)下面的引用
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庫(kù)下面的引用
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api project(':imkit')
api 'cn.rongcloud.sdk:call_lib:5.4.0'
}
沖突一:glide版本沖突
統(tǒng)一下版本,統(tǒng)一用高版本,但老項(xiàng)目得做兼容,把老的glide相關(guān)代碼替換為新的glide支持
沖突二:androidx.lifecycle版本沖突,可以排除沖突的庫(kù)
implementation ('cn.rongcloud.sdk:im_kit:5.4.0')
{
exclude group: 'androidx.lifecycle', module: 'lifecycle-runtime'
exclude group: 'androidx.room', module: 'room-runtime'
}
沖突三:資源沖突,aapt這種也基本上是存在不同版本的庫(kù)
?定位沖突的地方,統(tǒng)一版本
?三,融云音視頻配置
3.1 初始化
RongIM.init(this, appKey);
這個(gè)地方要注意,要用IMKit庫(kù)初始化,不能用IMLib初始化,不然頁(yè)面顯示方面會(huì)有問(wèn)題,音視頻黑屏沒(méi)畫(huà)面
//RongIMClient.init(this, appKey);
3.2 獲取token
使用融云要先獲取token,連接上融云服務(wù)后才能使用聊天功能,測(cè)試的話可以在融云平臺(tái)生成臨時(shí)token,正式需要后端接口配合。
?3.3 連接融云
//連接融云
RongIMClient.connect(token, new RongIMClient.ConnectCallback() {
@Override
public void onSuccess(String userId) {
}
@Override
public void onError(RongIMClient.ConnectionErrorCode e) {
}
@Override
public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) {
}
});
3.4 連接成功之后同步用戶(hù)信息
//同步用戶(hù)信息,用于展示頭像昵稱(chēng)
RongIM.setUserInfoProvider(new UserDataProvider.UserInfoProvider() {
@Override
public 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 {
//異步方式同步用戶(hù)信息,調(diào)取接口刷新本地用戶(hù)緩存
getOtherUserInfo(userId);
return null;
}
}
}, true);
刷新用戶(hù)緩存
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 調(diào)起語(yǔ)音通話文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-662273.html
RongCallKit.startSingleCall(this, mFriend.getUserId(), RongCallKit.CallMediaType.CALL_MEDIA_TYPE_AUDIO);
3.6 監(jiān)聽(tīng)語(yǔ)音通話文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-662273.html
//監(jiān)聽(tīng)語(yǔ)音通話狀態(tài)
RongCallKit.setCustomerHandlerListener(new RongCallCustomerHandlerListener() {
@Override
public List<String> handleActivityResult(int requestCode, int resultCode, Intent data) {
return null;
}
@Override
public void addMember(Context context, ArrayList<String> currentMemberIds) {
}
@Override
public void onRemoteUserInvited(String userId, RongCallCommon.CallMediaType mediaType) {
}
@Override
public void onCallConnected(RongCallSession callSession, SurfaceView localVideo) {
}
/**
* 通話結(jié)束。
* 通話中,對(duì)方掛斷,己方掛斷,或者通話過(guò)程網(wǎng)絡(luò)異常造成的通話中斷,都會(huì)回調(diào)
*
* @param callSession 通話實(shí)體。
* @param reason 通話中斷原因。
*/
@Override
public void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {
if(callSession.getSelfUserId().equals(callSession.getCallerUserId())) {
//通話時(shí)長(zhǎng)
int longTime=(int) (callSession.getEndTime() - callSession.getStartTime()) / 1000;
if (callSession.getEndTime()>0){
//掛斷通話
}else {
//取消通話
}
}
}
@Override
public void onCallMissed(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {
}
});
到了這里,關(guān)于Android之 集成音視頻通話的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!