本文主要介紹了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 | 配置License相關參數,注冊推流SDK。若不調用注冊函數,推流功能無法使用。 | |
二、設置直播連麥互動 | 設置連麥互動,用戶可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動。 |
注冊SDK
推流SDK升級到4.4.2及以后版本,接入一體化License服務。在使用推流功能前必須進行注冊,否則無法使用推流SDK功能。具體操作,請參見Android端注冊SDK。
配置推流參數(基礎版)
您可以使用AlivcLivePushConfig配置推流參數,每個參數有一個對應的默認值。您可以根據需求修改對應的屬性值。關于默認值和參數范圍,請參見Android基礎版推流SDK接口說明或Android互動版推流SDK接口說明
如需在推流過程中實時修改參數,請參見AlivcLivePusher提供的屬性和方法。
基本推流配置。
基本推流配置對應參數都有默認值,建議采用默認值,即您可以進行簡單初始化,不做配置。
// 初始化推流配置類 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)。
關閉自適應碼率后,碼率將固定在初始碼率,不會在設定的目標碼率和最小碼率之間自適應調整。如果網絡情況不穩定,可能造成播放卡頓,請慎用。
配置碼率控制。
碼率控制通過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
配置分辨率自適應。
分辨率自適應即動態調整推流分辨率。開啟功能后,當網絡較差時會自動降低分辨率以提高視頻的流暢度和清晰度。示例代碼如下:
mAlivcLivePushConfig.setEnableAutoResolution(true); // 打開分辨率自適應,默認為false
重要某些播放器可能不支持動態分辨率,如果您需要使用分辨率自適應功能,建議使用阿里云播放器。
分辨率自適應只有在清晰度優先或流暢度優先時才會生效(AlivcQualityModeEnum參數配置),自定義模式時無效。
配置美顏功能。
如需在推流SDK中使用美顏功能,需要引入美顏庫并配置對應回調。
通過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控件
獲取美顏插件庫LiveBeauty。
說明參考獲取美顏特效SDK License此文檔,配置License。
通過
clone
命令從此路徑(LiveBeauty)下載相關插件庫代碼到本地。git clone https://github.com/MediaBox-Demos/amdemos-android-live.git
在Android Studio項目根目錄下打開命令行。執行如下代碼,再通過
File > New > Import Module
將LiveBeauty
模塊導入到你的Android項目中。git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***
說明示例代碼中“***/***/***”是你想要放置
LiveBeauty
模塊的位置在項目的
settings.gradle
文件中添加模塊的路徑:include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'
說明示例代碼中,“app”為主模塊。
同時在項目主模塊的
build.gradle
文件中,添加對LiveBeauty
模塊的依賴:dependencies { implementation project(':LiveBeauty') implementation project(':LiveBeauty:live_queenbeauty') }
點擊
File > Sync Project with Gradle Files
,等待 Gradle 同步完成后,即可使用LiveBeauty
模塊。
配置美顏插件UI模塊。
在本項目的布局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" />
在Activity中初始化
QueenBeautyMenu
。例如:// 初始化美顏菜單面板 QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context); beautyMenuPanel.onHideMenu(); beautyMenuPanel.onHideValidFeatures(); beautyMenuPanel.onHideCopyright(); // 在布局中添加美顏菜單 QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel); beautyBeautyContainerView.addView(beautyMenuPanel);
設置人臉面部識別及美顏回調。
如果您有接入第三方美顏庫的需求,可設置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(); } });
配置圖片推流。
為了更好的用戶體驗,推流SDK提供了后臺圖片推流和碼率過低時進行圖片推流的設置。當SDK退至后臺時默認暫停推流視頻,只推流音頻,此時可以設置圖片來進行圖片推流和音頻推流。例如,在圖片上提醒用戶主播離開片刻,稍后回來。示例代碼如下:
mAlivcLivePushConfig.setPausePushImage("退后臺png圖片路徑");//設置用戶后臺推流的圖片
另外,當網絡較差時您可以根據自己的需求設置推流一張靜態圖片。設置圖片后,SDK檢測到當前碼率較低時,會推流此圖片,避免視頻流卡頓。示例代碼如下所示:
mAlivcLivePushConfig.setNetworkPoorPushImage("網絡差png圖片路徑");//設置網絡較差時推流的圖片
配置水印。
推流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值等比縮放。
要實現文字水印,可以先將文字轉換為圖片,再使用此接口添加水印。
配置預覽顯示模式。
推流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處理操作。
接口調用的順序必須按照說明的順序調用,否則會因調用順序不正確而出現異常。
初始化。
在配置好推流參數后,可以使用推流SDK的init方法進行初始化。示例代碼如下:
AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher(); mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
說明AlivcLivePusher目前不支持多實例,所以一個init必須對應有一個destroy。
注冊推流回調。
推流回調分為三種:
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() { //流無效通知 } });
開始預覽。
livePusher對象初始化及回調配置完成之后,可以進行開始預覽操作。預覽時需要傳入攝像頭預覽的顯示SurfaceView。示例代碼如下:
mAlivcLivePusher.startPreview(mSurfaceView)//開始預覽,也可根據需求調用異步接口startPreviewAysnc來實現
重要部分接口(如背景音樂、攝像頭相關操作)必須在設置預覽之后才能調用。因此,建議開始推流前先進行預覽。
開始推流。
預覽成功后才可以開始推流,因此需監聽onPreviewStarted回調,在回調里面添加如下代碼。
mAlivcLivePusher.startPush(mPushUrl);
說明推流SDK同時提供了異步方法,可調用startPushAysnc來實現。
推流SDK支持RTMP格式和RTS格式的推流地址,且RTS推流相對于RTMP推流穩定性和抗弱網有顯著提升,建議用戶優先使用RTS推流。RTMP和RTS推流效果對比及RTS推流方法,請參見推流SDK進行RTS推流指南。
使用正確的推流地址開始推流后,可用播放器(阿里云播放器、FFplay、VLC等)進行拉流測試,拉流地址獲取請參見生成推流地址和播放地址。
設置其他推流控制。
推流控制主要包括開始推流、停止推流、停止預覽、重新推流、暫停推流、恢復推流、銷毀推流等操作,用戶可以根據業務需求添加按鈕進行操作。
/*正在推流狀態下可調用暫停推流。暫停推流后,視頻預覽和視頻推流保留在最后一幀,音頻推流繼續*/ 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();
設置背景音樂。
推流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);
重要背景音樂相關接口在開始預覽之后才可調用。
設置推流截圖。
推流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(); } } });
攝像頭相關操作。
攝像頭相關操作包括推流狀態、暫停狀態、重連狀態等,還可操作攝像頭切換、閃光燈、焦距、變焦和鏡像設置等。示例代碼如下:
/*切換前后攝像頭*/ 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);
重要您攝像頭相關接口只能在開始預覽之后調用。
配置外部音視頻輸入。
推流SDK支持將外部的音視頻源輸入進行推流,比如推送一個音視頻文件。
配置外部音視頻輸入。
示例代碼如下:
/** * 輸入自定義音頻數據 * @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);
插入外部視頻數據。
示例代碼如下:
/** * 輸入自定義視頻流 * * @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);
插入音頻數據。
示例代碼如下:
/** * AlivcImageFormat輸入的視頻圖像格式 * AlivcSoundFormat輸入的音頻幀格式 * 其他參數:如輸出分辨率,音頻采樣率,通道數等在config里 setResolution,setAudioSamepleRate,setAudioChannels里設置 * 附:輸入自定義視頻和音頻流時,調用inputStreamVideoData,inputStreamAudioData等接口 */ mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12, AlivcSoundFormat.SOUND_FORMAT_S16);
動態貼紙。
推流SDK實現了在直播流中添加動態貼紙效果,使用此功能可實現動態水印效果。
動態貼紙的制作可參考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文件中的內容,無需修改。
添加動態貼紙。
示例代碼如下:
/** * 添加動態貼紙 * @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);
刪除動態貼紙。
示例代碼如下:
mAlivcLivePusher.removeDynamicsAddons(int id);
其他接口的使用。
/*在自定義模式下,用戶可以實時調整最小碼率和目標碼率*/ 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支持錄屏推流。使用錄屏推流需在初始化操作、設置預覽及開始推流之后進行相關配置。具體操作如下:
配置錄屏模式。
Android推流SDK支持三種錄屏模式,請按需設置。
錄屏模式
所需配置
錄屏時不開啟攝像頭
在config中設置權限請求的返回數據即可。
錄屏時開啟攝像頭
說明主播端有攝像頭預覽,同樣觀眾端也有攝像頭畫面(通過錄屏錄制進去)
在config中設置權限請求的返回數據。
調用StartCamera傳入surfaceView。
錄屏時開啟攝像頭
說明主播端無攝像頭預覽,觀眾端有攝像頭畫面疊加
在config中設置權限請求的返回數據。
調用StartCamera無需傳入surfaceView。
調用startCameraMix傳入觀眾端攝像頭畫面顯示位置。
設置開啟錄屏權限。
錄屏采用MediaProjection,需要用戶請求權限,將權限請求返回的數據通過此接口設置,即開啟錄屏模式。錄屏情況下,默認不開啟攝像頭。請在推流配置里進行配置,示例代碼如下:
mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData)
設置攝像頭預覽。
在錄屏開啟成功后,調用開啟或關閉攝像頭預覽接口,示例代碼如下:
mAlivcLivePusher.startCamera(surfaceView);//開啟攝像頭預覽 mAlivcLivePusher.stopCamera();//關閉攝像頭預覽
說明錄屏模式下攝像頭預覽surfaceView的長寬建議設置成1:1,這樣在屏幕旋轉時無需調整surfaceview。
若設置的長寬不為1:1,則需要在屏幕旋轉時,調整surfaceView的比例后,先stopCamera再startCamera。
如果主播端不需要預覽,則surfaceview填為null。
設置攝像頭混流。
當主播端不需要攝像頭預覽,觀眾端需要的情況可開啟混流,主要應用于游戲直播,主播不想玩游戲的時候攝像頭畫面擋住游戲畫面,示例代碼如下:
/** * @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();//停止攝像頭混流
設置屏幕旋轉。
錄屏模式下,可設置感應的屏幕旋轉角度,支持橫屏和豎屏錄制,示例代碼如下:
mAlivcLivePusher.setScreenOrientation(0);
說明在橫豎屏切換時,需要在應用層監聽OrientationEventListener事件,并將旋轉角度設置到此接口。
設置隱私。
當主播在錄屏時要進行密碼輸入等操作時,主播可以開啟隱私保護功能,結束操作后可以關閉隱私,示例代碼如下:
mAlivcLivePusher.pauseScreenCapture();//開啟隱私保護 mAlivcLivePusher.resumeScreenCapture();//關閉隱私保護
說明暫停錄屏,如果在config中設置了setPausePushImage則觀眾端會在此接口后顯示圖片。如果沒有,則觀眾端停留在最后一幀。
設置直播連麥互動(互動版)
直播推流SDK互動版V4.4.4及以上版本提供基于RTC的連麥互動能力,V4.4.5及以上版本提供基于RTC的連麥PK互動能力,用戶可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動,直播連麥相關的功能使用,請參見連麥互動開發指南和主播PK互動開發指南。
注意事項
使用Android推流SDK需要注意以下事項:
事項 | 說明 |
混淆規則 | 檢查混淆,確認已將SDK相關包名加入至不混淆名單中。
|
接口調用 |
|