全部產品
Search
文件中心

ApsaraVideo Live:Android端

更新時間:Jun 30, 2024

通過閱讀本文,您可以瞭解Android端阿里雲播放器SDK整合Native RTS SDK實現超低延時直播的方法。

SDK整合

添加阿里雲播放器SDK和Native RTS SDK的依賴檔案,有以下兩種方式:

  • 方式一:Maven整合

    1. 在工程的app/build.gradle檔案中添加阿里雲播放器SDK和Native RTS SDK的依賴檔案。

      implementation 'com.aliyun.sdk.android:AlivcArtc:5.4.4.0'
      implementation 'com.aliyun.rts.android:RtsSDK:2.1.0'
      implementation 'com.aliyun.sdk.android:AliyunPlayer:5.4.4.0-full'
      說明
      • AlivcArtcRtsSDK對應的依賴檔案添加後,阿里雲播放器SDK會自動將RTS SDK載入為外掛程式。

      • 此處Maven依賴的版本僅供參考。擷取最新的版本,阿里雲播放器SDK請參見Android播放器SDK超低延時直播SDK請參見SDK下載

      • 整合阿里雲播放器SDK和Native RTS SDK時需要滿足對應的配套關係,詳情請參見發布日誌

    2. 添加Maven倉庫地址。

      在根目錄的build.gradle中添加Maven倉庫地址。

      //MPChart maven倉庫地址,如果不需要曲線圖,可以刪除
      maven { url 'https://jitpack.io' }
      //阿里雲相關SDK(阿里雲播放器、RTS SDK) Maven倉庫地址
      maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
  • 方式二:手動aar整合

    1. 將對應的.aar檔案拷貝到app/libs目錄下。aar檔案

    2. 在app/build.gradle檔案中,添加如下代碼:

      dependencies{
          implementation fileTree(dir: 'libs', include: ['*.aar'])
      }

阿里雲播放器SDK介面使用

調用阿里雲播放器SDK介面實現超低延時直播功能。更多阿里雲播放器SDK功能,請參見進階功能API說明

說明
  • 以下為範例程式碼。詳細代碼請參見開源專案

  • 基於阿里雲播放器實現RTS拉流時,不能調用pause暫停直播流。您可以先調用stop停止播放,再調用prapare重新播放。

  • 不支援seek(拖動)。

  • 載入庫

    根據實際需求,在適當的Activity內加入System.loadLibrary("RtsSDK");

    static {
        System.loadLibrary("RtsSDK");
    }
  • 建立播放器

    通過AliPlayerFactory類可建立兩種播放器:AliPlayer和AliListPlayer。單個播放功能使用AliPlayer,建立方法如下所示:

    AliPlayer aliyunVodPlayer;
    .....
    aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());
  • 設定播放器監聽事件

    播放器提供了多種監聽事件,例如:onPrepared、onCompletion等。設定方法如下所示:

    aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            //出錯事件
        }
    });
    aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            //準備成功事件
        }
    });
    aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            //視頻解析度變化回調
        }
    });
    aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            //首幀渲染顯示事件
        }
    });
    aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            //其他資訊的事件,type包括迴圈播放開始、緩衝位置、當前播放位置、自動播放開始等
        }
    });
    aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            //緩衝開始
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            //緩衝進度
        }
        @Override
        public void onLoadingEnd() {
            //緩衝結束
        }
    });
    aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            //顯示字幕
        }
        @Override
        public void onSubtitleHide(long id) {
            //隱藏字幕
        }
    });
    aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            //切換音視頻流或者清晰度成功
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            //切換音視頻流或者清晰度失敗
        }
    });
    aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            //播放器狀態改變事件
        }
    });
    aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            //截圖事件
        }
    });
  • 建立DataSource

    播放器支援4種播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要將URL設定為artc://協議,才可以使用RTS服務。

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("artc://<播流地址>");
    aliyunVodPlayer.setDataSource(urlSource);
  • 設定顯示的View

    如果源有畫面,需要設定顯示的View(支援SurfaceView和TextureView)到播放器中,用來顯示畫面。此處以SurfaceView舉例說明,如下所示:

    surfaceView = (SurfaceView) findViewById(R.id.playview);
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(holder);
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            aliyunVodPlayer.surfaceChanged();
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(null);
        }
    });
  • 播放控制

    您需要自行建立播放器的控制按鈕,在按鈕事件裡面實現播放器控制介面。基本控制功能有播放、停止,使用樣本如下所示:

    //準備,在準備完成的回調介面中,調用start()可以開始播放
    aliyunVodPlayer.prepare();
    //開始播放
    aliyunVodPlayer.start();
    //停止播放
    aliyunVodPlayer.stop();
    //重設
    aliyunVodPlayer.reset();
    //釋放(釋放後播放器將不可再被使用)
    aliyunVodPlayer.release();
  • 播放參數配置

    配置播放參數,提升超低延時直播效果。

    //擷取配置
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    //設定最大延時為1秒,延時控制由ARTC控制
    config.mMaxDelayTime = 1000;
    //設定播放器啟播緩衝為10毫秒,資料控制由ARTC控制。
    config.mHighBufferDuration = 10;
    config.mStartBufferDuration = 10;
    ....//其他設定
    //給播放器載入配置
    mAliyunVodPlayer.setConfig(config);
  • 日誌開關

    //開啟日誌
    Logger.getInstance(context).enableConsoleLog(true);
    Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE);
    //關閉日誌
    Logger.getInstance(context).enableConsoleLog(false);
    Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);
  • 直播降級

    直播降級是將首碼為artc://的播放器URL源字串直接修改為 http-flv 形式,然後更新播放器UrlSource,並開始播放的策略。

    /**
     * 降級策略
     */
    private void willBeDemoted() {
        mRtsAliPlayer.stop();
        if (mUrl.startsWith("artc://")) {
            setDataSource("http://xxxx.flv");
            mRtsAliPlayer.prepare();
        }
    }
  • 擷取TraceId

    播放器事件回調收到播放組件中透傳輸出的訊息時,解析播放器事件說明JSON字串,得到的code是RtsSDK中的message,收到E_HELP_SUPPORT_ID_SUBSCRIBE時,解析字串中"-sub-"後的字串得到TraceId。

    private static final int TRACE_ID_CODE = 104;
    
    //監聽播放器 onInfo 回調,並解析 Rts 事件訊息
    mRtsAliPlayer.setOnInfoListener(infoBean -> {
        if (infoBean.getCode() == InfoCode.DirectComponentMSG) {
            String extraMsg = infoBean.getExtraMsg();
            parseDirectComponentMSG(extraMsg);
        }
    });
    
    private void parseDirectComponentMSG(String msg) {
        if (msg.contains("code=" + TRACE_ID_CODE)) {
            parseTraceId(msg);
        }
    }
    
    /**
     * 解析 TraceId
     */
    private void parseTraceId(String msg) {
        String[] split = msg.split("-sub-");
        if (split.length >= 1) {
            mTraceId = "RequestId:" + (split[1].substring(0, split[1].length() - 1));
            mTraceId = mTraceId.replace("\"", "").replace("\\", "");
        }
    }