天天看點

Android平台下通過JNI快速實作音視訊通信音視訊通信一、初始化SDK二、登入系統三、進入房間四、釋放資源

<a target="_blank" href="http://blog.51cto.com/attachment/201302/090010445.png"></a>

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  

    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 

                    &amp;&amp; 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 

                    &amp;&amp; anychat.GetUserVideoWidth(-1) != 0) {  

                SurfaceHolder holder = myView.getHolder();      //獲得SurfaceView控件  

                holder.setFixedSize(anychat.GetUserVideoWidth(-1),  

                        anychat.GetUserVideoHeight(-1));        //設定視訊顯示寬高  

                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我們也能快速實作音視訊通信

本文轉自 fanxiaojun 51CTO部落格,原文連結:http://blog.51cto.com/2343338/1141245,如需轉載請自行聯系原作者

繼續閱讀