前兩天,圖鴨君給大家介紹了如何在iOS端搭建音視頻通信系統,今天我就給大家介紹一下如何搭建一個完整的Android音視頻通信系統。
一、準備:
首先在圖鴨官網:http://tucodec.com 進行注冊,獲得SDK中所需要的AppKey、AppSecret,注冊登錄后如下圖所示:
其次到開發者里選擇下載android中所需SDK。
最后解壓,如下圖所示:
voip_android_demo1.0是用于演示的demo,圖鴨君也將要按照這個demo以及SDK開發文檔進行講解,打開resource資源文件,如圖4所示:
將voip_android.aar提取出來導入到工程,里面包含了提供相關操作的java類以及so庫,配置相關的環境。
導入”voip_android.aar”文件(如圖5)
在“libs”文件夾下添加aar包,在build文件夾下添加:
repositories {
? ? flatDir {
? ? ? ? dirs 'libs'
? ? }
}
在dependencies下添加:
compile(name: 'voip_android', ext: 'aar')
配置其他三方庫(如圖5)
在gradle文件里面的dependencies 下添加下面三方庫:
api "com.alibaba:fastjson:1.1.63.android"加入權限AndroidManifest.xml加入以下權限:
完成上述操作后,我們的音視頻通訊App所需的大體框架已經完成啦,之后就是碼代碼,完成系統UI界面繪制和用戶之間通訊的邏輯操作。
在圖鴨科技提供的SDK中,我們可以看到只需要調用三個類進行操作,可見快速集成音視頻通信并不是那么復雜。如圖6所示:
二、操作類定義:
1、TYVoipAndroid:提供所有Voip相關方法
2、TYVoipVideoCapture:攝像頭管理類
3、TYVoipVideoRender:Voip客戶端視頻渲染視圖.,渲染在此視圖上進行
了解上述主要接口文件及其定義后,我們來了解SDK中的通信原理:在SDK中,所有用戶都以通訊節點的形式存在,作為節點的用戶都擁有自己唯一的表示——?UserID ,整個SDK會根據每個用戶的UserID來進行通訊。
例如,甲和乙之間進行通訊,假設甲的UserID為401,乙的UserID為402,甲登錄后向乙發送我要和你開視頻,乙登錄后向甲發送我要和你開視頻,甲開始渲染乙的視圖,乙開始渲染甲的視圖?。完成上述所有操作后,甲乙建立通訊。
三、完整的SDK使用步驟簡介:
<1>初始化TYVoipAndroid、TYVoipVideoCapture類:
mTYVoipAndroid =?new TYVoipAndroid(new Handler(), Context,null);
mVideoCapture = TYVoipVideoCapture(mTYVoipAndroid , ? ? ? ? ? ? ?????????????????????????????TYVoipVideoCapture.CaptureParam(mTYVoipAndroid.config.videoWidth, ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mTYVoipAndroid.config.videoHeight));
<2>登錄轉發服務器(建議寫成單例,一次登錄,多次調用):
loginRelayServer(String ip, short port, int userId, int sessionId,?int AppKey, int AppSecret);
<3>開啟相機,注冊音視頻回調,初始化Voip客戶端,開啟傳輸
mVideoCapture.start(false, mTYVoipAndroid.config, mMainRender.parent??? as?? ViewGroup);
mTYVoipAndroid.registerVideoCallback(mVideoCallback);
mTYVoipAndroid.registerAudioCallback(mAudioCallback);
mTYVoipAndroid.initVoip(mVideoCapture);
mTYVoipAndroid.startVoip(int videoBitRate, int audioBitRate, int userId);
<4>根據邏輯,添加(刪除)需要通話的節點:
mTYVoipAndroid.addClientNode(int userId);
//mTYVoipAndroid.removeClientNode(int userId);
<5>不需要通話時,停止voip:
mTYVoipAndroid.stopCall()
//清空現有的連接節點(不再接收節點的數據)
mTYVoipAndroid.clearClientNodeList();
<6>根據具體的業務邏輯重復步驟3、4、5
<7>在程序結束時銷毀voip
mTYVoipAndroid.release()
四、部分代碼解釋:(從用戶甲的實現代碼來解釋)
private TYVoipVideoRender preView;? ? //渲染甲的視圖
private TYVoipVideoRender otherView;? //渲染乙的視圖
<1>登錄操作:
? 甲(UserID:401)登錄操作,返回值為是否登錄成功(非0即為成功):
/**
*連接轉發服務器
*@param ip @param 端口號@param userId @param sessionId
*@param AppKey @param AppSecret @return !0即為成功
*/
mTYVoipAndroid.loginRelayServer(ip, port, 401, sessionId, AppKey,? AppSecret);
<2>連接操作
甲連接乙操作:
...一系列操作/
//甲自己加入到通訊中
mTYVoipAndroid.startVoip(512, 16000, 401);
//添加節點(添加乙的USerID)
mTYVoipAndroid.addClientNode(402);
//在videoCallBack上進行視圖渲染
private TYVoipAndroid.VideoCallback mVideoCallback = new TYVoipAndroid.VideoCallback() {
? ? @Override
? ? public void renderVoipVideoData(VoipImage voipImage) {
? ? ? ? if (voipImage.isLocal){
? ? ? ? //本地視頻渲染(甲的數據流)
? ? ? ? preView.pushVideoFrame(voipImage);
? ? ? ? }else {
//非本地視頻渲染(乙的數據流)
? ? ? ? ? otherView.pushVideoFrame(voipImage);
? ? ? ? }
? ? }
};
//在audioCallBack回調方法目前還未用到,忽視此回調
<3>斷開操作
甲進行斷開通信操作
//停止相機視頻捕捉
mVideoCapture.stop()
//清空現有的連接節點(不再接收節點的數據)
mTYVoipAndroid.clearClientNodeList();
//結束Voip通話
mTYVoipAndroid.stopCall()
//釋放資源
mTYVoipAndroid.release()
項目中最重要的代碼介紹完啦,那測試一下,看看我們的成果吧。
達到上圖所示結果,一套完整的android音視頻通信系統就完成了。