昨天,圖鴨君給大家介紹瞭如何在iOS端搭建音視頻通信系統,今天我就給大家介紹一下如何搭建一個完整的Android音視頻通信系統。
一、準備:
首先在圖鴨官網:http://tucodec.com 進行註冊,獲得SDK中所需要的AppKey、AppSecret,註冊登錄後如下圖所示:
圖1 註冊後獲取AppKey、AppSecret
其次到開發者裏選擇下載android中所需SDK。
圖2 SDK下載展示
最後解壓,如下圖所示:
圖3 SDK解壓後內容
voip_android_demo1.0是用於演示的demo,圖鴨君也將要按照這個demo以及SDK開發文檔進行講解,打開resource資源文件,如圖4所示:
圖4 resource文件夾內容
將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加入以下權限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
圖5 gradle文件內容
完成上述操作後,我們的音視頻通訊App所需的大體框架已經完成啦,之後就是碼代碼,完成系統UI界面繪製和用戶之間通訊的邏輯操作。
在圖鴨科技提供的SDK中,我們可以看到只需要調用三個類進行操作,可見快速集成音視頻通信並不是那麼複雜。如圖6所示:
圖6 SDK中操作類
二、操作類定義:
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()
項目中最重要的代碼介紹完啦,那測試一下,看看我們的成果吧。
圖7 測試效果圖
達到上圖所示結果,一套完整的android音視頻通信系統就完成了。