全部產品
Search
文件中心

ApsaraVideo Live:功能使用

更新時間:Nov 15, 2024

本文主要介紹了Android端直播推流SDK的功能和使用方法。包括SDK的主要介面、基本使用流程說明,同時還提供了相關功能的使用樣本。旨在協助開發人員更好地理解和應用SDK進行直播推流操作。

說明

如果您需要使用移動端進行推流,詳細操作請參見推流、拉流與播流

Android推流SDK特性

  • 支援RTMP推流協議。

  • 支援基於RTC的RTS超低延時直播推拉流協議。

  • 支援連麥互動和PK互動。

  • 使用視頻H.264編碼以及音頻AAC編碼。

  • 支援碼控、解析度、顯示模式等自訂配置。

  • 支援多種網路攝影機相關操作。

  • 支援即時美顏和自訂美顏效果調節。

  • 支援增、刪動態貼紙實現動態浮水印效果。

  • 支援錄屏直播。

  • 支援自訂YUV、PCM等外部音視頻輸入。

  • 支援多路混流功能。

  • 支援純音視頻推流以及後台推流。

  • 支援背景音樂及其相關操作。

  • 可使用視訊截圖功能。

  • 支援自動重連、異常處理。

  • 支援音頻3A演算法。

  • 增加視頻軟編、硬編切換邏輯,提升編碼模組穩定性。

推流主要介面類列表

說明

AlivcLivePushConfig

推流初始配置

AlivcLivePusher

推流功能類

AlivcLivePusherErrorListener

錯誤回調

AlivcLivePusherNetworkListener

網路相關通知回調

AlivcLivePusherInfoListener

推流相關資訊回調

AlivcLivePusherBGMListener

背景音樂回調

AlivcLivePushCustomFilter

自訂濾鏡回調

AlivcLivePushCustomDetect

自訂臉部偵測回調

AlivcSnapshotListener

截圖回調

功能限制

使用Android推流SDK需注意以下限制:

  • 您只能在推流之前設定橫豎屏模式,不支援在直播的過程中即時切換。

  • 在推流設定為橫屏模式時,需設定介面為不允許自動旋轉。

  • 在硬編模式下,考慮編碼器相容問題解析度會使用16的倍數,如設定為540P,則輸出的解析度為544*960,在設定播放器視圖大小時需按輸出解析度等比縮放,避免黑邊等問題。

推流SDK使用流程

基礎版SDK的基本使用流程如下

步驟

描述

操作指引及程式碼範例

一、註冊SDK

配置License相關參數,註冊推流SDK。若不調用註冊函數,推流功能無法使用。

註冊SDK

二、配置推流參數

完成推流基本配置、碼率控制配置、解析度自適應配置、美顏功能配置等。

配置推流參數(基礎版)

三、使用推流SDK推流

初始化SDK、註冊推流回調、建立預覽視圖後可以開始推流。使用者可以根據業務需求添加推流量控制、設定背景音樂、網路攝影機、外部音頻、動態貼紙等。

重要
  • 開始推流前必須初始化SDK及建立預覽視圖。

  • 阿里雲ApsaraVideo for Live不允許同一時間向同一個推流URL進行多路推流(第二路推流會被拒絕)。

使用推流SDK推流(基礎版)

四、設定錄屏推流(按需)

如需使用錄屏推流,可以實現錄屏推流相關的配置。

設定錄屏推流(基礎版)

互動版SDK使用流程如下

步驟

描述

操作指引及程式碼範例

一、註冊SDK

配置License相關參數,註冊推流SDK。若不調用註冊函數,推流功能無法使用。

註冊SDK

二、設定直播連麥互動

設定連麥互動,使用者可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動。

設定直播連麥互動(互動版)

註冊SDK

推流SDK升級到4.4.2及以後版本,接入一體化License服務。在使用推流功能前必須進行註冊,否則無法使用推流SDK功能。具體操作,請參見Android端註冊SDK

配置推流參數(基礎版)

您可以使用AlivcLivePushConfig配置推流參數,每個參數有一個對應的預設值。您可以根據需求修改對應的屬性值。關於預設值和參數範圍,請參見Android基礎版推流SDK介面說明Android互動版推流SDK介面說明

說明

如需在推流過程中即時修改參數,請參見AlivcLivePusher提供的屬性和方法。

  1. 基本推流配置。

    基本推流配置對應參數都有預設值,建議採用預設值,即您可以進行簡單初始化,不做配置。

    範例程式碼

    // 初始化推流配置類
    mAlivcLivePushConfig = new AlivcLivePushConfig();
    // 設定推流模式,預設普通推流模式
    mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveBasicMode);
    // 設定解析度,預設540P
    mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
    // 設定幀率,預設20fps
    mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
    // 設定視頻編碼Gop,單位秒,預設2秒
    mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
    // 開啟碼率自適應,預設為true
    mAlivcLivePushConfig.setEnableBitrateControl(true);
    // 設定橫豎屏,預設為豎屏,可設定home鍵向左或向右橫屏
    mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
    // 設定音頻編碼模式,預設AAC-LC
    mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
    // 設定視頻編碼模式,預設硬編
    mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
    // 設定音頻編碼模式,預設軟編
    mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
    // 設定網路攝影機前後置,預設前置
    mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
    // 設定App推後台或暫停時推圖片
    mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
    // 設定弱網推圖片
    mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
    重要
    • 綜合手機效能和網路頻寬要求,建議您將解析度設定為540P(主流移動直播App基本都採用540P)。

    • 關閉自適應碼率後,碼率將固定在初始碼率,不會在設定的目標碼率和最小碼率之間自適應調整。如果網路情況不穩定,可能造成播放卡頓,請慎用。

  2. 配置碼率控制。

    碼率控制通過AlivcQualityModeEnum參數配置。推流SDK提供以下碼率控制模式,請根據實際需求修改參數值。

    碼率控制模式

    描述

    範例程式碼

    QM_RESOLUTION_FIRST

    清晰度優先模式。SDK內部會對碼率參數進行配置,優先保障推流視頻的清晰度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST);//清晰度優先

    QM_FLUENCY_FIRST

    流暢度優先模式。SDK內部會對碼率參數進行配置,優先保障推流視頻的流暢度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_FLUENCY_FIRST);//流暢度優先

    QM_CUSTOM

    自訂模式。SDK會根據開發人員設定的碼率進行配置。設定為自訂模式時,您可以選擇配置畫質優先或者流暢度優先,並自行設定初始碼率、最小碼率和目標碼率。

    • 初始碼率:開始直播時的碼率。

    • 最小碼率:當網路較差時,碼率會逐步減低到最小碼率,以減少視頻的卡頓。

    • 目標碼率:當網路較好時,碼率會逐步提高到目標碼率,以提高視頻清晰度。

    mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM);
    mAlivcLivePushConfig.setTargetVideoBitrate(1000); //目標碼率1000kbps
    mAlivcLivePushConfig.setMinVideoBitrate(300); //最小碼率300kbps
    mAlivcLivePushConfig.setInitialVideoBitrate(800); //初始碼率800kbps
    說明
    • 選擇清晰度優先或流暢度優先模式時,不需設定初始碼率、最小碼率和目標碼率(initialVideoBitrate、minVideoBitrate、targetVideoBitrate)。推流SDK內部策略會自動保障在網路抖動情況下優先考慮視頻清晰度或流暢度。

    • 選擇自訂碼率時,請參考阿里雲推薦設定配置對應碼率。推薦設定請參考下表內容。

    表 1. 自訂碼率控制推薦設定(畫質優先)

    解析度

    初始碼率 initialVideoBitrate

    最小碼率 minVideoBitrate

    目標碼率 targetVideoBitrate

    360P

    600

    300

    1000

    480P

    800

    300

    1200

    540P

    1000

    600

    1400

    720P

    1500

    600

    2000

    1080P

    1800

    1200

    2500

    表 2. 自訂碼率控制推薦設定(流暢度優先)

    解析度

    初始碼率 initialVideoBitrate

    最小碼率 minVideoBitrate

    目標碼率 targetVideoBitrate

    360P

    400

    200

    600

    480P

    600

    300

    800

    540P

    800

    300

    1000

    720P

    1000

    300

    1200

    1080P

    1500

    1200

    2200

  3. 配置解析度自適應。

    解析度自適應即動態調整推流解析度。開啟功能後,當網路較差時會自動降低解析度以提高視頻的流暢度和清晰度。範例程式碼如下:

    mAlivcLivePushConfig.setEnableAutoResolution(true); // 開啟解析度自適應,預設為false
    重要
    • 某些播放器可能不支援動態解析度,如果您需要使用解析度自適應功能,建議使用阿里雲播放器。

    • 解析度自適應只有在清晰度優先或流暢度優先時才會生效(AlivcQualityModeEnum參數配置),自訂模式時無效。

  4. 配置美顏功能。

    如需在推流SDK中使用美顏功能,需要引入美顏庫並配置對應回調。

    1. 通過Maven方式引入美顏庫及美顏面板,在工程的build.gradle檔案中添加如下代碼,美顏SDK版本請參考最新Demo

      implementation "com.aliyun.maliang.android:queen:2.5.0-official-full"
      implementation("com.aliyun.maliang.android:queen_menu:2.5.0-official-full") {
          exclude group: 'com.aliyun.maliang.android', module: 'queen'
      }

      還可以整合Demo中的LiveBeauty模組:

      檔案或檔案夾

      功能描述

      live_beauty

      美顏基礎抽象類別

      queen_beauty

      美顏基礎UI控制項

    2. 擷取美顏外掛程式庫LiveBeauty。

      說明

      參考擷取美顏特效SDK License此文檔,配置License。

      1. 通過clone命令從此路徑(LiveBeauty)下載相關外掛程式庫代碼到本地。

        git clone https://github.com/MediaBox-Demos/amdemos-android-live.git
      2. 在Android Studio專案根目錄下開啟命令列。執行如下代碼,再通過File > New > Import Module LiveBeauty 模組匯入到你的Android專案中。

        git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***
        說明

        範例程式碼中“***/***/***”是你想要放置LiveBeauty模組的位置

      3. 在專案的settings.gradle檔案中添加模組的路徑:

        include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'
        說明

        範例程式碼中,“app”為主模組。

      4. 同時在專案主模組的build.gradle檔案中,添加對 LiveBeauty 模組的依賴:

        dependencies {
            implementation project(':LiveBeauty')
            implementation project(':LiveBeauty:live_queenbeauty')
        }
      5. 點擊File > Sync Project with Gradle Files,等待 Gradle 同步完成後,即可使用LiveBeauty模組。

    3. 配置美顏外掛程式UI模組。

      1. 在本專案的布局XML檔案中添加 QueenBeautyMenu 的控制項。例如:

        <com.aliyunsdk.queen.menu.QueenBeautyMenu
            android:id="@+id/beauty_beauty_menuPanel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true" />
      2. 在Activity中初始化QueenBeautyMenu。例如:

        // 初始化美顏菜單面板
        QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context);
        beautyMenuPanel.onHideMenu(); 
        beautyMenuPanel.onHideValidFeatures(); 
        beautyMenuPanel.onHideCopyright(); 
        
        // 在布局中添加美顏菜單
        QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel);
        beautyBeautyContainerView.addView(beautyMenuPanel);
    4. 設定人臉臉部辨識及美顏回調。

      如果您有接入第三方美顏庫的需求,可設定setCustomDetect和setCustomFilter回調。

      • AlivcLivePushCustomDetect回呼函數customDetectProcess(long data、int width、int height、int rotation、int format、long extra參數)中返回的參數data是採集資料的指標,第三方美顏庫可對資料指標中的資料進行識別或者處理。

      • AlivcLivePushCustomFilter回呼函數customFilterProcess(int inputTexture、inttextureWidth、int textureHeight、long extra參數)中返回的參數inputTexture是映像的紋理texture,第三方美顏庫可對紋理進行處理。如果需要返回一個處理過的紋理texture,則返回texture id。否則,返回原來的inputTexture即可。

      範例程式碼

      /**
       * 人臉臉部辨識回調
       */
      mAlivcLivePusher.setCustomDetect(new AlivcLivePushCustomDetect() {
          @Override
          public void customDetectCreate() {
      
          }
      
          @Override
          public long customDetectProcess(long dataPtr, int width, int height, int rotation, int format, long extra) {
              return 0;
          }
      
          @Override
          public void customDetectDestroy() {
      
          }
      });
      
      /**
       * 美顏回調
       */
       
       /**
       * 初始化BeautyManager
       */
      mAlivcLivePusher.setCustomFilter(new AlivcLivePushCustomFilter() {
          @Override
          public void customFilterCreate() {
              initBeautyManager();
          }
      
       /**
       * 處理推流視頻流,添加美顏效果
       */
          @Override
          public int customFilterProcess(int inputTexture, int textureWidth, int textureHeight, long extra) {
              if (mBeautyManager == null) {
                  return inputTexture;
              }
      
              return mBeautyManager.onTextureInput(inputTexture, textureWidth, textureHeight);
          }
      
          @Override
          public void customFilterDestroy() {
              destroyBeautyManager();
          }
      });
  5. 配置圖片推流。

    為了更好的使用者體驗,推流SDK提供了後台圖片推流和碼率過低時進行圖片推流的設定。當SDK退至後台時預設暫停推流視頻,只推流音頻,此時可以設定圖片來進行圖片推流和音頻推流。例如,在圖片上提醒使用者主播離開片刻,稍後回來。範例程式碼如下:

    mAlivcLivePushConfig.setPausePushImage("退後台png圖片路徑");//設定使用者後台推流的圖片

    另外,當網路較差時您可以根據自己的需求設定推流一張靜態圖片。設定圖片後,SDK檢測到當前碼率較低時,會推流此圖片,避免視頻流卡頓。範例程式碼如下所示:

    mAlivcLivePushConfig.setNetworkPoorPushImage("網路差png圖片路徑");//設定網路較差時推流的圖片
  6. 配置浮水印。

    推流SDK提供了添加浮水印功能,並且支援添加多個浮水印。浮水印圖片必須為PNG格式圖片。範例程式碼如下:

    mAlivcLivePushConfig.addWaterMark(waterPath,0.1,0.2,0.3);//添加浮水印
    說明
    • x、y、width為相對值,例如x為0.1表示浮水印的x值為推流畫面x軸的10%位置,如果推流解析度為540*960,則浮水印x值為54。

    • 浮水印圖片的高度,按照浮水印圖片的真實寬高與輸入的width值等比縮放。

    • 要實現文字浮水印,可以先將文字轉換為圖片,再使用此介面添加浮水印。

  7. 配置預覽顯示模式。

    推流SDK支援三種預覽模式,預覽顯示模式不影響推流。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL:預覽顯示時,鋪滿視窗。當視頻比例和視窗比例不一致時,預覽會有變形。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT:預覽顯示時,保持視頻比例。當視頻比例與視窗比例不一致時,預覽會有黑邊。

    • AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL:預覽顯示時,剪下視頻以適配視窗比例。當視頻比例和視窗比例不一致時,預覽會裁剪視頻。

    範例程式碼如下:

    mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);

使用推流SDK推流(基礎版)

AlivcLivePusher為使用推流SDK推流的核心類,提供初始化操作、推流回調、網路攝影機預覽、推流量控制、推流過程中的參數調節等功能。

說明
  • 介面的調用需要對介面拋出的異常進行處理,添加try catch處理操作。

  • 介面調用的順序必須按照說明的順序調用,否則會因調用順序不正確而出現異常。

  1. 初始化。

    在配置好推流參數後,可以使用推流SDK的init方法進行初始化。範例程式碼如下:

    AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
    mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
    說明

    AlivcLivePusher目前不支援多執行個體,所以一個init必須對應有一個destroy。

  2. 註冊推流回調。

    推流回調分為三種:

    • Info:主要做提示和狀態檢測使用。

    • Error:錯誤回調。

    • Network:主要為網路相關。

    使用者通過對應的回調通知,當發生對應的類型的事件時,相應的回呼函數被觸發運行。範例程式碼如下:

    設定推流錯誤事件

    /**
     * 設定推流錯誤事件
     *
     * @param errorListener 錯誤監聽器
     */
    mAlivcLivePusher.setLivePushErrorListener(new AlivcLivePushErrorListener() {
        @Override
        public void onSystemError(AlivcLivePusher livePusher, AlivcLivePushError error) {
            if (error != null) {
                //添加UI提示或者使用者自訂的錯誤處理
            }
        }
    
        @Override
        public void onSDKError(AlivcLivePusher livePusher, AlivcLivePushError error) {
            if (error != null) {
                //添加UI提示或者使用者自訂的錯誤處理
            }
        }
    });
                            

    設定推流通知事件

    /**
     * 設定推流通知事件
     *
     * @param infoListener 通知監聽器
     */
    mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
        @Override
        public void onPreviewStarted(AlivcLivePusher pusher) {
            //預覽開始通知
        }
    
        @Override
        public void onPreviewStoped(AlivcLivePusher pusher) {
            //預覽結束通知
        }
    
        @Override
        public void onPushStarted(AlivcLivePusher pusher) {
            //推流開始通知
        }
    
        @Override
        public void onFirstAVFramePushed(AlivcLivePusher alivcLivePusher) {
            //發送第一個音視頻包成功通知
        }
    
        @Override
        public void onPushPauesed(AlivcLivePusher pusher) {
            //推流暫停通知
        }
    
        @Override
        public void onPushResumed(AlivcLivePusher pusher) {
            //推流恢複通知
        }
    
        @Override
        public void onPushStoped(AlivcLivePusher pusher) {
            //推流停止通知
        }
    
        @Override
        public void onPushRestarted(AlivcLivePusher pusher) {
            //推流重啟通知
        }
    
        @Override
        public void onFirstFramePreviewed(AlivcLivePusher pusher) {
            //首幀渲染通知
        }
    
        @Override
        public void onDropFrame(AlivcLivePusher pusher, int countBef, int countAft) {
            //丟幀通知
        }
    
        @Override
        public void onAdjustBitRate(AlivcLivePusher pusher, int curBr, int targetBr) {
            //調整碼率通知
        }
    
        @Override
        public void onAdjustFps(AlivcLivePusher pusher, int curFps, int targetFps) {
            //調整幀率通知
        }
    
        @Override
        public void onPushStatistics(AlivcLivePusher alivcLivePusher, AlivcLivePushStatsInfo alivcLivePushStatsInfo) {
            //直播推流器統計資料回調(每2秒回調一次)
        }
    
        @Override
        public void onSetLiveMixTranscodingConfig(AlivcLivePusher alivcLivePusher, boolean isSuccess, String msg) {
            //設定雲端的混流(轉碼)參數回調,對應於setLiveMixTranscodingConfig介面,僅互動模式下生效
        }
    });

    設定網路通知事件

    /**
     * 設定網路通知事件
     *
     * @param infoListener 通知監聽器
     */
    mAlivcLivePusher.setLivePushNetworkListener(new AlivcLivePushNetworkListener() {
        @Override
        public void onNetworkPoor(AlivcLivePusher pusher) {
            //網路差通知
        }
    
        @Override
        public void onNetworkRecovery(AlivcLivePusher pusher) {
            //網路恢複通知
        }
    
        @Override
        public void onReconnectStart(AlivcLivePusher pusher) {
            //重連開始通知
        }
    
        @Override
        public void onConnectionLost(AlivcLivePusher alivcLivePusher) {
            //串連斷開通知
        }
    
        @Override
        public void onReconnectFail(AlivcLivePusher pusher) {
            //重連失敗通知
        }
    
        @Override
        public void onReconnectSucceed(AlivcLivePusher pusher) {
            //重連成功通知
        }
    
        @Override
        public void onSendDataTimeout(AlivcLivePusher pusher) {
            //發送資料逾時通知
        }
    
        @Override
        public void onConnectFail(AlivcLivePusher pusher) {
            //串連失敗通知
        }
    
        @Override
        public String onPushURLAuthenticationOverdue(AlivcLivePusher alivcLivePusher) {
            //鑒權到期通知
            return null;
        }
    
        @Override
        public void onSendMessage(AlivcLivePusher alivcLivePusher) {
            //發送sei通知
        }
    
        @Override
        public void onPacketsLost(AlivcLivePusher alivcLivePusher) {
            //推流過程丟包回調
        }
    });

    設定背景音樂播放通知事件

    /**
     * 設定背景音樂播放通知事件
     *
     * @param pushBGMListener 通知監聽器
     */
    mAlivcLivePusher.setLivePushBGMListener(new AlivcLivePushBGMListener() {
        @Override
        public void onStarted() {
            //播放開始通知
        }
    
        @Override
        public void onStoped() {
            //播放停止通知
        }
    
        @Override
        public void onPaused() {
            //播放暫停通知
        }
    
        @Override
        public void onResumed() {
            //播放恢複通知
        }
    
        @Override
        public void onProgress(long l, long l1) {
            //播放進度通知
        }
    
        @Override
        public void onCompleted() {
            //播放結束通知
        }
    
        @Override
        public void onDownloadTimeout() {
            //播放逾時通知
        }
    
        @Override
        public void onOpenFailed() {
            //流無效通知
        }
    });
  3. 開始預覽。

    livePusher對象初始化及回調配置完成之後,可以進行開始預覽操作。預覽時需要傳入網路攝影機預覽的顯示SurfaceView。範例程式碼如下:

    mAlivcLivePusher.startPreview(mSurfaceView)//開始預覽,也可根據需求調用非同步介面startPreviewAysnc來實現
    重要

    部分介面(如背景音樂、網路攝影機相關操作)必須在設定預覽之後才能調用。因此,建議開始推流前先進行預覽。

  4. 開始推流。

    預覽成功後才可以開始推流,因此需監聽onPreviewStarted回調,在回調裡面添加如下代碼。

    mAlivcLivePusher.startPush(mPushUrl);
    說明
    • 推流SDK同時提供了非同步方法呼叫,可調用startPushAysnc來實現。

    • 推流SDK支援RTMP格式和RTS格式的推流地址,且RTS推流相對於RTMP推流穩定性和抗弱網有顯著提升,建議使用者優先使用RTS推流。RTMP和RTS推流效果對比及RTS推流方法,請參見推流SDK進行RTS推流指南

    • 使用正確的推流地址開始推流後,可用播放器(阿里雲播放器、FFplay、VLC等)進行拉流測試,拉流地址擷取請參見產生推流地址和播放地址

  5. 設定其他推流量控制。

    推流量控制主要包括開始推流、停止推流、停止預覽、重新推流、暫停推流、恢複推流、銷毀推流等操作,使用者可以根據業務需求添加按鈕進行操作。

    範例程式碼

    /*正在推流狀態下可調用暫停推流。暫停推流後,視頻預覽和視頻推流保留在最後一幀,音頻推流繼續*/
    mAlivcLivePusher.pause();
    /*暫停狀態下可調用恢複推流。恢複推流後,音視頻預覽與推流恢複正常*/
    mAlivcLivePusher.resume();
    /*推流狀態下可調用停止推流,完成後推流停止*/
    mAlivcLivePusher.stopPush();
    /*在預覽狀態下才可以調用停止預覽,正在推流狀態下,調用停止預覽無效。預覽停止後,預覽畫面定格在最後一幀*/
    mAlivcLivePusher.stopPreview();
    /*推流狀態下或者接收到所有Error相關回調狀態下可調用重新推流, 且Error狀態下只可以調用此介面(或者reconnectPushAsync重連)或者調用destory銷毀推流。完成後重新開始推流,重啟ALivcLivePusher內部的一切資源,包括預覽、推流等等restart*/
    mAlivcLivePusher.restartPush();
    /*推流狀態下或者接收到AlivcLivePusherNetworkDelegate相關的Error回調狀態下可調用此介面, 且Error狀態下只可以調用此介面(或者restartPush重新推流)或者調用destory銷毀推流。完成後推流重連,重新連結推流RTMP*/
    mAlivcLivePusher.reconnectPushAsync();
    /*銷毀推流後,推流停止,預覽停止,預覽畫面移除。AlivcLivePusher相關的一切資源銷毀*/
    mAlivcLivePusher.destroy();
  6. 設定背景音樂。

    推流SDK提供了背景音樂播放、混音、降噪、耳返、靜音等功能。範例程式碼如下:

    /*開始播放背景音樂。*/
    mAlivcLivePusher.startBGMAsync(mPath);
    /*停止播放背景音樂。若當前現正播放BGM,並且需要切換歌曲,只需要調用開始播放背景音樂介面即可,無需停止當前現正播放的背景音樂*/
    mAlivcLivePusher.stopBGMAsync();
    /*暫停播放背景音樂,背景音樂開始播放後才可調用此介面*/
    mAlivcLivePusher.pauseBGM();
    /*恢複播放背景音樂,背景音樂暫停狀態下才可調用此介面*/
    mAlivcLivePusher.resumeBGM();
    /*開啟迴圈播放音樂*/
    mAlivcLivePusher.setBGMLoop(true);
    /*設定降噪開關。開啟降噪後,將對採集到的聲音中非人聲的部分進行過濾處理。可能存在對人聲稍微抑製作用,建議讓使用者自由選擇是否開啟降噪功能,預設不使用*/
    mAlivcLivePusher.setAudioDenoise(true);
    /*設定耳返開關。耳返功能主要應用於KTV情境。開啟耳返後,插入耳機將在耳機中聽到主播說話聲音。關閉後,插入耳機無法聽到人聲。未插入耳機的情況下,耳返不起作用*/
    mAlivcLivePusher.setBGMEarsBack(true);
    /*混音設定,提供背景音樂和人聲採集音量調整*/
    mAlivcLivePusher.setBGMVolume(50);//設定背景音樂音量
    mAlivcLivePusher.setCaptureVolume(50);//設定人聲採集音量
    /*設定靜音。靜音後音樂聲音和人聲輸入都會靜音。要單獨設定音樂或人聲靜音可以通過混音音量設定介面來調整*/
    mAlivcLivePusher.setMute(true);
    重要

    背景音樂相關介面在開始預覽之後才可調用。

  7. 設定推流截圖。

    推流SDK提供了本地視頻流截圖功能,範例程式碼如下:

    // 視頻流截圖,參數:截取圖片的個數、每張圖片的間隔、介面回調
    pusher.snapshot(1, 1, new AlivcSnapshotListener() {
        @Override
        public void onSnapshot(Bitmap bmp) {
                // 可以將截圖轉儲到本地png檔案,下面是範例程式碼
            String dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss-SS").format(new Date());
            File f = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "snapshot-" + dateFormat + ".png");
            if (f.exists()) {
                f.delete();
            }
            try {
                FileOutputStream out = new FileOutputStream(f);
                bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
  8. 網路攝影機相關操作。

    網路攝影機相關操作包括推流狀態、暫停狀態、重連狀態等,還可操作網路攝影機切換、閃光燈、焦距、變焦和鏡像設定等。範例程式碼如下:

    /*切換前後網路攝影機*/
    mAlivcLivePusher.switchCamera();
    /*開啟/關閉閃光燈,在自拍時開啟閃關燈無效*/
    mAlivcLivePusher.setFlash(true); 
    /*焦距調整,即可實現採集畫面的縮放功能。縮放範圍為[0,getMaxZoom()]。*/
    mAlivcLivePusher.setZoom(5);
    /*手動對焦。手動聚焦需要傳入兩個參數:1.point 對焦的點(需要對焦的點的座標);2.autoFocus 是否需要自動對焦,只有本次對焦操作調用該介面時,該參數才生效。後續是否自動對焦沿用上述自動聚焦介面設定值*/
    mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true);
    /*設定是否自動對焦*/
    mAlivcLivePusher.setAutoFocus(true);
    /*鏡像設定。鏡像相關介面有兩個,PushMirror推流鏡像和PreviewMirror預覽鏡像。PushMirror設定僅對播放畫面生效,PreviewMirror僅對預覽畫面生效,兩者互不影響*/
    mAlivcLivePusher.setPreviewMirror(false);
    mAlivcLivePusher.setPushMirror(false);
    重要

    您網路攝影機相關介面只能在開始預覽之後調用。

  9. 配置外部音視頻輸入。

    推流SDK支援將外部的音視頻源輸入進行推流,比如推送一個音視頻檔案。

    1. 配置外部音視頻輸入。

      範例程式碼如下:

      /**
      * 輸入自訂音頻資料
      * @param data 音頻資料byte array
      * @param size
      * @param sampleRate
      * @param channels
      * @param pts 音頻資料pts(μs)
      * 此介面不控制時序,需要調用方控制輸入音訊框架的時序
      */
      mAlivcLivePusher. inputStreamAudioData(byte[] data, int size, int sampleRate, int channels, long pts);
      /**
      * 輸入自訂音頻資料
      * @param dataPtr 音頻資料native記憶體指標
      * @param size
      * @param sampleRate
      * @param channels
      * @param pts 音頻資料pts(μs)
      * 此介面不控制時序,需要調用方控制輸入音訊框架的時序
      */
      mAlivcLivePusher. inputStreamAudioPtr(long dataPtr, int size, int sampleRate, int channels, long pts);
    2. 插入外部視頻資料。

      範例程式碼如下:

      /**
      * 輸入自訂視頻流
      *
      * @param data 視頻映像byte array
      * @param width 視頻映像寬度
      * @param height 視頻映像高度
      * @param size 視頻映像size
      * @param size 視頻映像stride
      * @param pts 視頻映像pts(μs)
      * @param rotation 視頻映像旋轉角度
      * 此介面不控制時序,需要調用方控制輸入視訊框架的時序
      * 附:調用此介面時需要在config中設定setExternMainStream(true,***)
      */
      mAlivcLivePusher. inputStreamVideoData(byte[] data, int width, int height, int stride, int size, long pts, int rotation);
      /**
      * 輸入自訂視頻流
      *
      * @param dataptr 視頻映像native記憶體指標
      * @param width 視頻映像寬度
      * @param height 視頻映像高度
      * @param size 視頻映像stride
      * @param size 視頻映像size
      * @param pts 視頻映像pts(μs)
      * @param rotation 視頻映像旋轉角度
      * 此介面不控制時序,需要調用方控制輸入視訊框架的時序
      * 附:調用此介面時需要在config中設定setExternMainStream(true,***)
      */
      mAlivcLivePusher. inputStreamVideoPtr(long dataptr, int width, int height, int stride, int size, long pts, int rotation);
    3. 插入音頻資料。

      範例程式碼如下:

      /**
      * AlivcImageFormat輸入的視頻映像格式
      * AlivcSoundFormat輸入的音訊框架格式
      * 其他參數:如輸出解析度,音頻採樣率,通道數等在config裡
      setResolution,setAudioSamepleRate,setAudioChannels裡設定
      * 附:輸入自訂視頻和音頻流時,調用inputStreamVideoData,inputStreamAudioData等介面
      */
      mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,
      AlivcSoundFormat.SOUND_FORMAT_S16);
  10. 動態貼紙。

    推流SDK實現了在直播流中添加動態貼紙效果,使用此功能可實現動態浮水印效果。

    1. 動態貼紙的製作可參考Demo提供的素材進行簡單修改。自己製作動圖貼紙的序列幀圖片,並開啟config.json檔案自訂以下參數:

      "du": 2.04,//播放一遍動畫持續的時間
      "n": "qizi",//動圖的名稱,製作動圖時檔案夾以動圖名稱命名,每一張圖片以動圖名稱+序號命名,比如qizi0
      "c": 68.0,//動畫幀數,即一個完整動畫的圖片數量
      "kerneframe": 51,//主要畫面格,即指定哪一張圖片為主要畫面格,比如demo中指定第51幀為主要畫面格(需確保51幀是存在的)
      "frameArry": [
          {"time":0,"pic":0},
          {"time":0.03,"pic":1},
          {"time":0.06,"pic":2},
          ],
      //動畫參數,上述參數即表示第0秒顯示第一幀(qizi0),第0.03秒顯示第二幀(qizi1)...以此規則填寫所有幀的動畫
      說明

      其他欄位可以直接使用demo提供的config.json檔案中的內容,無需修改。

    2. 添加動態貼紙。

      範例程式碼如下:

      /**
      * 添加動態貼紙
      * @param path 貼紙檔案路徑,必須含config.json
      * @param x 顯示起始x位置(0~1.0f)
      * @param y 顯示起始y位置(0~1.0f)
      * @param w 顯示寬度(0~1.0f)
      * @param h 顯示高度(0~1.0f)
      * @return id 貼紙id,刪除貼紙時需設定id
      */
      mAlivcLivePusher.addDynamicsAddons("貼紙路徑", 0.2f, 0.2f, 0.2f, 0.2f);
    3. 刪除動態貼紙。

      範例程式碼如下:

      mAlivcLivePusher.removeDynamicsAddons(int id);
  11. 其他介面的使用。

    /*在自訂模式下,使用者可以即時調整最小碼率和目標碼率*/
    mAlivcLivePusher.setTargetVideoBitrate(800);
    mAlivcLivePusher.setMinVideoBitrate(400);
    /*是否支援自動對焦*/
    mAlivcLivePusher.isCameraSupportAutoFocus();
    /*是否支援閃光燈*/
    mAlivcLivePusher.isCameraSupportFlash();
    /*擷取是否正在推流的狀態*/
    mAlivcLivePusher.isPushing(); 
    /*擷取推流地址*/
    mAlivcLivePusher.getPushUrl();
    /*擷取推流效能調試資訊。推流績效參數具體參數和描述參考API文檔或者介面注釋*/
    mAlivcLivePusher.getLivePushStatsInfo();
    /*擷取版本號碼*/
    mAlivcLivePusher.getSDKVersion();
    /*設定log層級,根據需求過濾想要的調試資訊*/
    mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll);
    /*擷取當前sdk狀態*/
    AlivcLivePushStats getCurrentStatus();
    /*擷取上一個錯誤碼,如無錯誤返回:ALIVC_COMMON_RETURN_SUCCESS*/
    AlivcLivePushError getLastError();

設定錄屏推流(基礎版)

推流SDK支援錄屏推流。使用錄屏推流需在初始化操作、設定預覽及開始推流之後進行相關配置。具體操作如下:

  1. 配置錄屏模式。

    Android推流SDK支援三種錄屏模式,請按需設定。

    錄屏模式

    所需配置

    錄屏時不開啟網路攝影機

    1. 在config中設定許可權請求的返回資料即可。

    錄屏時開啟網路攝影機

    說明

    主播端有網路攝影機預覽,同樣觀眾端也有網路攝影機畫面(通過錄屏錄製進去)

    1. 在config中設定許可權請求的返回資料。

    2. 調用StartCamera傳入surfaceView。

    錄屏時開啟網路攝影機

    說明

    主播端無網路攝影機預覽,觀眾端有網路攝影機畫面疊加

    1. 在config中設定許可權請求的返回資料。

    2. 調用StartCamera無需傳入surfaceView。

    3. 調用startCameraMix傳入觀眾端網路攝影機畫面顯示位置。

  2. 設定開啟錄屏許可權。

    錄屏採用MediaProjection,需要使用者請求許可權,將許可權請求返回的資料通過此介面設定,即開啟錄屏模式。錄屏情況下,預設不開啟網路攝影機。請在推流配置裡進行配置,範例程式碼如下:

    mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData)
  3. 設定網路攝影機預覽。

    在錄屏開啟成功後,調用開啟或關閉網路攝影機預覽介面,範例程式碼如下:

    mAlivcLivePusher.startCamera(surfaceView);//開啟網路攝影機預覽
    mAlivcLivePusher.stopCamera();//關閉網路攝影機預覽
    說明
    • 錄屏模式下網路攝影機預覽surfaceView的長寬建議設定成1:1,這樣在旋轉螢幕時無需調整surfaceview。

    • 若設定的長寬不為1:1,則需要在旋轉螢幕時,調整surfaceView的比例後,先stopCamera再startCamera。

    • 如果主播端不需要預覽,則surfaceview填為null。

  4. 設定網路攝影機混流。

    當主播端不需要網路攝影機預覽,觀眾端需要的情況可開啟混流,主要應用於遊戲直播,主播不想玩遊戲的時候網路攝影機畫面擋住遊戲畫面,範例程式碼如下:

    /**
    * @param x 混流顯示x初始位置(0~1.0f)
    * @param y 混流顯示y初始位置(0~1.0f)
    * @param w 混流顯示寬度(0~1.0f)
    * @param h 混流顯示高度(0~1.0f)
    * @return
    */
    mAlivcLivePusher.startCameraMix(x, y, w, h);//開啟網路攝影機混流
    mAlivcLivePusher.stopCameraMix();//停止網路攝影機混流
  5. 設定旋轉螢幕。

    錄屏模式下,可設定感應的旋轉螢幕角度,支援橫屏和豎屏錄製,範例程式碼如下:

    mAlivcLivePusher.setScreenOrientation(0);
    說明

    在橫豎屏切換時,需要在應用程式層監聽OrientationEventListener事件,並將旋轉角度設定到此介面。

  6. 設定隱私。

    當主播在錄屏時要進行密碼輸入等操作時,主播可以開啟隱私保護功能,結束操作後可以關閉隱私,範例程式碼如下:

    mAlivcLivePusher.pauseScreenCapture();//開啟隱私保護
    mAlivcLivePusher.resumeScreenCapture();//關閉隱私保護
    說明

    暫停錄屏,如果在config中設定了setPausePushImage則觀眾端會在此介面後顯示圖片。如果沒有,則觀眾端停留在最後一幀。

設定直播連麥互動(互動版)

直播推流SDK互動版V4.4.4及以上版本提供基於RTC的連麥互動能力,V4.4.5及以上版本提供基於RTC的連麥PK互動能力,使用者可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動,直播連麥相關的功能使用,請參見連麥互動開發指南主播PK互動開發指南

注意事項

使用Android推流SDK需要注意以下事項:

事項

說明

混淆規則

檢查混淆,確認已將SDK相關包名加入至不混淆名單中。

-keep class com.alivc.** { *;}

介面調用

  • 同步和非同步介面都可以正常調用,盡量使用非同步介面調用,可以避免對主線程的資源消耗。

  • SDK介面會在發生錯誤或者調用順序不對時拋出異常(throws),調用時注意添加try catch處理,否則會造成程式的crash。

  • 介面調用順序,如下圖所示: