阿里云RTC的基本功能包含初始化SDK、加入頻道、本地發(fā)布、訂閱遠端和離開頻道等。通過閱讀本文,您可以了解阿里云RTC的基本功能。

前提條件

  • 您已下載并集成最新版本的SDK。具體操作,請參見Android端集成SDK
  • 您已獲取加入頻道必需的頻道鑒權(quán)令牌(Token)。具體操作,請參見生成Token

使用限制

本文僅供SDK 2.1及以上版本使用,如果您需要SDK 1.17版本對應的文檔,請參見Android端實現(xiàn)基本功能

操作步驟

說明 本文中的實現(xiàn)方法僅供參考,您可以根據(jù)實際業(yè)務需求進行開發(fā)。
  1. 初始化SDK。

    您需要創(chuàng)建AliRtcEngine實例,并注冊回調(diào)。具體回調(diào)接口請參見回調(diào)及監(jiān)聽

    private void getInstance() {
    
      AliRtcEngine engine = AliRtcEngine.getInstance(getApplicationContext());
      engine.setRtcEngineEventListener(eventListener);
      engine.setRtcEngineNotify(engineNotify); 
    }
    1. 本地預覽。在創(chuàng)建完AliRtcEngine實例后,您可以創(chuàng)建canvas布局進行本地預覽視頻。
      private void setLocalViewConfig() {
      
          // 創(chuàng)建 SurfaceView 對象。
          private FrameLayout mLocalContainer;
          private SurfaceView mLocalView;
      
          mLocalView = engine.CreateRendererView(getApplicationContext());
          mLocalView.setZOrderMediaOverlay(true);
          mLocalContainer.addView(mLocalView);
          // 設(shè)置本地視圖。
          AliVideoCanvas canvas = new AliRtcEngine.AliVideoCanvas();
        canvas.view = surfaceView; 
        canvas.renderMode = AliRtcRenderModeAuto;    
          engine.setLocalViewConfig(canvas,AliRtcVideoTrackCamera);
          engine.startPreview();
      }
      說明
      • AliRtcRenderMode提供四種渲染模式:
        • AliRtcRenderModeAuto(推薦):自動。
        • AliRtcRenderModeStretch:拉伸填充視圖,不保持視頻比例。
        • AliRtcRenderModeFill:在保持視頻寬高比的同時縮放,填充黑邊。
        • AliRtcRenderModeClip:在保持視頻寬高比的同時縮放,并裁剪以適合視圖。
      • AliRtcRenderMirrorMode在本地或遠端均可設(shè)置鏡像模式,并提供三種鏡像模式:
        • AliRtcRenderMirrorModeOnlyFront:只有前置攝像頭預覽鏡像,其余不鏡像。
        • AliRtcRenderMirrorModeAllEnabled:全部鏡像。
        • AliRtcRenderMirrorModeAllDisable:全部不鏡像。
    2. 可選:取消本地預覽。
      engine.stopPreview();
    3. 設(shè)置發(fā)布與訂閱。
      • SDK默認入會后自動發(fā)布音頻流與視頻流,如果您不希望自動發(fā)布音頻和視頻,可以在入會前通過以下接口設(shè)置:
        engine.publishLocalAudioStream(false);//默認不發(fā)布音頻流
        engine.publishLocalVideoStream(false);//默認不發(fā)布視頻流
      • SDK默認入會后自動訂閱遠端的音頻流與視頻流,如果您不希望自動訂閱音頻與視頻,可以在入會前通過以下接口設(shè)置:
        engine.setDefaultSubscribeAllRemoteAudioStreams(false);//默認不訂閱音頻流
        engine.setDefaultSubscribeAllRemoteVideoStreams(false);//默認不訂閱視頻流
  2. 加入頻道。
    AliRtcAuthInfo userInfo = new AliRtcAuthInfo();
    authinfo.channelId   = /* 您的channelId */;
    authinfo.appId     = /* 您的Appid */;
    authinfo.nonce     = /* 您的nonce */;
    authinfo.userId   = /* 您的userId */;
    authinfo.token     = /* 您的token */;
    authinfo.timestamp = /* 您的timestamp */;
    authinfo.gslb      = /* 您的gslb地址 */;
    
    engine.joinChannel(userInfo, mUsername);
    參數(shù) 描述
    appId 應用ID,在控制臺應用管理頁面創(chuàng)建和查看。
    channelId 頻道ID。1~64位,由大小寫字母、數(shù)字、下劃線(_)、短劃線(-)組成。
    userId 用戶ID。1~64位,由大小寫字母、數(shù)字、下劃線(_)、短劃線(-)組成。
    說明 同一個用戶ID在其他端登錄,先入會的端會被后入會的端踢出頻道。
    nonce 隨機碼。以前綴AK-開頭,由大小寫字母、數(shù)字組成,最大64字節(jié)。例如:AK-2b9be4b25c2d38c409c376ffd2372be1。
    timestamp 過期時間戳。可以選擇12小時、24小時、3天和7天,代表令牌有效時間。
    token 頻道鑒權(quán)令牌,計算方法:token = sha256(appId + appKey + channelId + userId + nonce + timestamp)
    gslb 服務地址,該參數(shù)是數(shù)組類型,當前請使用:["https://rgslb.rtc.aliyuncs.com"],請您通過業(yè)務服務器下發(fā)到客戶端SDK,不建議您將該地址固化在客戶端代碼。
  3. 發(fā)布或取消發(fā)布本地流。
    • 發(fā)布本地音頻流和視頻流

      如果您在入會前沒有設(shè)置發(fā)布音頻流和視頻流,則入會后會自動發(fā)布本地的音頻流和視頻流;如果您在入會前設(shè)置取消發(fā)布音頻流和視頻流,則入會后需要調(diào)用以下接口進行手動發(fā)布:

      engine.publishLocalAudioStream(true);//發(fā)布音頻流
      engine.publishLocalVideoStream(true);//發(fā)布視頻流
    • 發(fā)布小流

      SDK默認不發(fā)布小流,如果您需要推送小流,請調(diào)用以下接口(入會前、后均可調(diào)用):

      engine.publishLocalDualStream(true);
    • 取消發(fā)布本地音頻流和視頻流

      如果您需要取消發(fā)布本地的音頻流和視頻流,請調(diào)用以下接口:

      engine.publishLocalAudioStream(false);//取消發(fā)布音頻流
      engine.publishLocalVideoStream(false);//取消發(fā)布視頻流
  4. 訂閱或取消訂閱遠程流。
    • 訂閱遠端音頻流和視頻流

      如果您在入會前沒有設(shè)置訂閱音頻流和視頻流,則入會后會自動訂閱遠端的音頻流和視頻流;如果您在入會前設(shè)置取消訂閱音頻流和視頻流,則入會后需要調(diào)用以下接口進行手動訂閱:

      engine.setDefaultSubscribeAllRemoteAudioStreams(true);//訂閱全部的遠端音頻流
      engine.setDefaultSubscribeAllRemoteVideoStreams(true);//訂閱全部的遠端視頻流
      說明 此接口作用于后續(xù)入會的遠端用戶,對于調(diào)用此接口之前已經(jīng)入會的遠端用戶,此接口不產(chǎn)生影響。

      訂閱成功后,您可以在onRemoteTrackAvailableNotify回調(diào)里渲染遠端的視頻畫面:

       public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack,
                                                       AliRtcEngine.AliRtcVideoTrack videoTrack) {
              // UI或者邏輯處理,例如渲染遠端視頻流的操作如下。
              if(videoTrack == AliRtcVideoTrackCamera) {
              // 視頻流
              AliRtcEngine.AliRtcVideoCanvas canvas = new AliRtcEngine.AliRtcVideoCanvas();
              canvas.renderMode = /* renderMode */;
              canvas.view = view;/* 渲染view */
              engine.setRemoteViewConfig(canvas, uid, AliRtcVideoTrackCamera);
            }
          });
      } 
    • 取消訂閱遠端音頻流和視頻流

      如果您需要取消訂閱遠端的音頻流和視頻流,請調(diào)用以下接口:

      engine.setDefaultSubscribeAllRemoteAudioStreams(false);//取消訂閱遠端音頻流
      engine.setDefaultSubscribeAllRemoteVideoStreams:(false);//取消訂閱遠端視頻流
      說明 此接口作用于后續(xù)入會的遠端用戶,對于調(diào)用此接口之前已經(jīng)入會的遠端用戶,此接口不產(chǎn)生影響。
    • 訂閱特定用戶的音頻流和視頻流

      當已取消訂閱所有的音頻流和視頻流之后,如果您需要訂閱某個遠端用戶的音頻流和視頻流,可以通過調(diào)用以下接口實現(xiàn)(如果需要取消訂閱此遠端用戶的音頻流和視頻流,參數(shù)sub傳入false即可):

      engine.subscribeRemoteAudioStream(uid,true);//訂閱特定用戶的音頻流
      engine.subscribeRemoteVideoStream(uid,AliRtcVideoTrackCamera,true);//訂閱特定用戶的視頻流
    • 訂閱小流

      如果您需要訂閱小流,請調(diào)用以下接口:

      engine.setRemoteDefaultVideoStreamType(AliRtcVideoStreamTypeLow);
      說明 此接口作用于后續(xù)入會的遠端用戶,對于調(diào)用此接口之前已經(jīng)入會的遠端用戶,此接口不產(chǎn)生影響。
    • 取消訂閱所有遠端用戶音頻流和視頻流

      如果您希望當前會議中及后續(xù)入會的用戶全部取消訂閱,請調(diào)用以下接口:

      engine.subscribeAllRemoteAudioStreams(false);
      engine.subscribeAllRemoteVideoStreams(false);
      說明
      • 當以上接口設(shè)置為false時,優(yōu)先級最高,即使setDefaultSubscribeAllRemoteAudioStreams和setDefaultSubscribeAllRemoteVideoStreams設(shè)置為true時也不生效。
      • 當以上接口設(shè)置為true時,是否訂閱以setDefaultSubscribeAllRemoteAudioStreams和setDefaultSubscribeAllRemoteVideoStreams設(shè)置為準。
  5. 離開頻道。
    engine.leaveChannel(); 

后續(xù)步驟

您可以下載示例代碼,快速運行Demo,實現(xiàn)頻道內(nèi)和其他人進行實時音視頻通話,詳情請參見運行Android Demo