在Android平臺下實現音視訊語音聊天
音視訊通訊
作為獨立開發者或想縮短音視訊開發週期的公司來說,想要在Android平臺下實現音視訊通訊,最快捷的方法是尋找開源專案或呼叫其他公司API。之所以這麼說是因為音視訊通訊技術涉及到底層音視訊採集、解碼、 FFmpeg(音視訊處理解決方案)、媒體流傳輸協議等太多太多相關技術知識點。試了 幾個開源專案,視訊差強人意,語音與視訊不同步等不穩定因素。因此我把目光放到其他公司的API上(點選下載demo程式)。demo程式API提供了一系列純Java語言的呼叫介面,通過JNI即可呼叫核心共享庫(.so 類似win32 的dll),根據官方開發文件我很快就實現音視訊通訊,下面是我在呼叫其API的經驗總結。視訊效果圖如下:
Android通訊平臺相關API方法
- // 初始化SDK
- public native int InitSDK(int osver, int flags);
- // 連線伺服器
- public native int Connect(String serverip, int port);
- // 登入系統
- public native int Login(String username, String password);
- // 進入房間(房間ID)
- public native int EnterRoom(int roomid, String password);
- // 進入房間(房間名稱)
- public native int EnterRoomEx(String roomname, String password);
- // 退出房間
- public native int LeaveRoom(int roomid);
- // 設定視訊顯示位置
- public native int SetVideoPos(int userid, Surface surface, int lef,
- int top, int right, int bottom);
- /**
- * 功能: 設定視訊顯示位置,或是重新整理視訊顯示 返回值:0表示成功,否則為出錯程式碼
- * 引數:
- * userid 使用者ID
- * surface 視訊顯示介面,android客戶端只需提供SurfaceView控制元件,核心自動將視訊顯示在控制元件上
- * lef,top,right,bottom視訊顯示位置資訊
- */
- // 登出登入
- public native int Logout();
- // 釋放資源
- public native int Release();
一、初始化SDK
初始化SDK是首先要完成的,用於設定SDK的一些行為,包括設定對應的回撥函式。程式碼如下:
- //初始化SDK
- private void InitialSDK() {
- if (anychat == null) {
- anychat = new AnyChatCoreSDK();
- //設定基本事件回撥函式
- anychat.SetBaseEvent(this);
- if (configEntity.useARMv6Lib != 0)
- anychat.SetSDKOptionInt(AnyChatDefine.
- BRAC_SO_CORESDK_USEARMV6LIB, 1); //使用ARMv6指令集
- anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); //初始化SDK 的一個引數是android API版本
- bNeedRelease = true;
- }
- }
二、登入系統
當初始化SDK完成之後,便可以實現連線伺服器、驗證使用者身份、使用者登入等。
- //連線伺服器
- anychat.Connect("211.155.25.90", 8906);
- //登入系統
- anychat.Login("android","");
連線伺服器和登入系統都是一個非同步的過程,呼叫後會立即返回。在回撥函式中根據返回程式碼判斷伺服器是否連線成功和登入成功。
三、進入房間
登入成功後就可進入相應的房間,只有在相同房間的使用者才能進行音視訊通訊。程式碼如下
1、進入房間
- //進入1號房間
- anychat.EnterRoom(1, "");
進入房間後系統會將該房間線上使用者傳送給客戶端,只有在同一個房間使用者才能進行音視訊互交、文字聊天、檔案傳輸等。當新使用者進入房間或使用者下線,都會觸發非同步訊息通知上層應用更改狀態。
2、文字聊天
成功進入房間後,便可呼叫API介面向指定使用者或房間中所有線上使用者傳送文字 聊天訊息。
- //傳送文字聊天訊息
- String message = messageEditText.getText().toString();
- anychat.SendTextMessage(-1, 0,message);
其他使用者收到文字聊天訊息會觸發相應的回撥函式並將聊天訊息顯示在介面上。
3、請求其他使用者的音視訊
- // 請求對方的視訊流
- anychat.UserCameraControl(userID, 1);
- // 請求對方的音訊流
- anychat.UserSpeakControl(userID, 1);
4、音視訊的顯示與播放
- //判斷遠端使用者視訊是否已開啟
- if (!bOtherVideoOpened) {
- if (anychat.GetCameraState(userID) == 2
- && anychat.GetUserVideoWidth(userID) != 0) {
- SurfaceHolder holder = otherView.getHolder(); //獲得SurfaceView控制元件
- holder.setFormat(PixelFormat.RGB_565); //設定顯示格式
- holder.setFixedSize(anychat.GetUserVideoWidth(userID),
- anychat.GetUserVideoHeight(userID)); //設定視訊顯示寬高
- Surface s = holder.getSurface(); //獲得視訊畫面
- anychat.SetVideoPos(userID, s, 0, 0, 0, 0); //呼叫API顯示視訊畫面
- bOtherVideoOpened = true;
- }
- }
- //判斷本地視訊是否已開啟
- if (!bSelfVideoOpened) {
- if (anychat.GetCameraState(-1) == 2
- && anychat.GetUserVideoWidth(-1) != 0) {
- SurfaceHolder holder = myView.getHolder(); //獲得SurfaceView控制元件
- holder.setFormat(PixelFormat.RGB_565); //設定顯示格式
- holder.setFixedSize(anychat.GetUserVideoWidth(-1),
- anychat.GetUserVideoHeight(-1)); //設定視訊顯示寬高
- Surface s = holder.getSurface(); //獲得視訊畫面
- anychat.SetVideoPos(-1, s, 0, 0, 0, 0); //呼叫API顯示視訊畫面
- bSelfVideoOpened = true;
- }
- }
Android程式中,當收到使用者的媒體流資料時,Android客戶端只需提供一個SurfaceView控制元件,核心自動將視訊媒體流資料顯示在該控制元件上並播放聲音。
四、釋放資源
與前面講的連線伺服器、登入系統、進入房間對應的的是離開房間、登出系統、釋放資源。程式碼如下:
- protected void onDestroy() {
- //離開房間
- anychat.LeaveRoom(-1);
- //登出登入
- anychat.Logout();
- //釋放資源 關閉SDK 不再返回登入介面
- anychat.Release();
- }
離開房間後可再進入房間,但是登出登入和釋放資源後,SDK將不再工作。在Activity生命週期結束的時候可以將佔用資源釋放,程式退出。
總結:還有其他諸如傳送檔案、P2P連線、對Android裝置設定、獲取線上使用者等非常實用功能等待你們去挖掘。用java我們也能快速實現音視訊通訊。