通過閱讀本文,您可以瞭解Android端阿里雲播放器SDK實現超低延時直播的方法。
SDK整合
添加阿里雲播放器SDK的依賴檔案,樣本如下:
Maven整合
添加Maven倉庫地址。
在根目錄的build.gradle中添加Maven倉庫地址。
//阿里雲相關SDK(阿里雲播放器) Maven倉庫地址 maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }在工程的app/build.gradle檔案中添加阿里雲播放器SDK依賴檔案。
def player_sdk_version = "x.x.x" // 建議使用最新版本 def rts_sdk_version = "7.12.0" // 獨立版本號碼,目前最新版本 // 播放器主庫 implementation "com.aliyun.sdk.android:AliyunPlayer:$player_sdk_version-full" // 播放器與Rts低延時直播組件的橋接層(AlivcArtc),版本號碼需要與播放器一致,需要和 Rts低延時直播組件 一起整合 implementation "com.aliyun.sdk.android:AlivcArtc:$player_sdk_version" // Rts低延時直播組件 implementation "com.aliyun.rts.android:RtsSDK:$rts_sdk_version"重要播放器與RTS低延時直播組件的橋接層(AlivcArtc)需與播放器版本號碼保持一致,且必須與RTS低延時直播組件同時整合。
播放器版本請參考SDK下載,建議使用最新版本。播放器版本要求:推薦使用最新版本,最低支援V5.4.5.0。
常見問題請參見Android播放器常見問題。
阿里雲播放器SDK介面使用
調用阿里雲播放器SDK介面實現超低延時直播功能。更多阿里雲播放器SDK功能,請參見進階功能和API說明。
以下為範例程式碼。詳細代碼請參見 API-Example RTS超低延時直播播放模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
基於阿里雲播放器實現RTS拉流時,不能調用pause暫停直播流。您可以先調用stop停止播放,再調用prepare重新播放。
不支援seek(拖動)。
載入RTS庫
根據實際需求,在適當的Activity內加入System.loadLibrary("RtsSDK");。
static {
System.loadLibrary("RtsSDK");
}建立播放器
建立播放器。
通過
AliPlayerFactory類建立AliPlayer播放器。// 建立播放器執行個體 AliPlayer mAliPlayer = AliPlayerFactory.createAliPlayer(context); // 傳入traceid // 可選:推薦使用`播放器單點追查`功能,當使用阿里雲播放器 SDK 播放視頻發生異常時,可藉助單點追查功能針對具體某個使用者或某次播放會話的異常播允許存取為進行全鏈路追蹤,以便您能快速診斷問題原因,可有效改善播放體驗治理效率。 // traceId 值由您自行定義,需為您的使用者或使用者裝置的唯一識別碼,例如傳入您業務的 userid 或者 IMEI、IDFA 等您業務使用者的裝置識別碼。 mAliPlayer.setTraceId("traceId");說明播放器提供的播放品質監控(可查看播放器整體播放品質相關資料)、單點追查(可定位到具體的使用者或裝置,分析其播允許存取為,快速定位播放異常等問題)及視頻播放統計功能都依賴埋點日誌上報功能而實現。
在建立播放器時,根據
setTraceId參數的設定不同,其後續可實現的功能不同,具體如下:setTraceId參數不傳(預設):埋點日誌上報功能開啟,後續可以使用播放品質監控和視頻播放統計功能,無法使用單點追查功能。setTraceId參數傳入traceid:traceid的值由您自行定義,需為您的使用者或使用者裝置的唯一識別碼,例如傳入您業務的userid或者IMEI、IDFA等您業務使用者的裝置ID。傳入traceid後,埋點日誌上報功能開啟,後續可以使用播放品質監控、單點追查和視頻播放統計功能。setTraceId參數設定為DisableAnalytics:關閉埋點日誌上報,後續無法使用播放品質監控、單點追查和視頻播放統計功能。
設定顯示視圖。
播放器支援AliDisplayView(推薦)、SurfaceView和TextureView,任選其中一種即可。
在 XML 檔案中聲明視圖。
AliDisplayView(推薦)
<!-- 播放器渲染視圖 --> <com.aliyun.player.videoview.AliDisplayView android:id="@+id/ali_display_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />SurfaceView
<!-- 播放器渲染視圖 --> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />TextureView
<!-- 播放器渲染視圖 --> <TextureView android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />設定顯示視圖。
AliDisplayView(推薦)
調用播放器的
setDisplayView介面,綁定播放器視圖。AliDisplayView mAliDisplayView = findViewById(R.id.display_view); // 可以通過 setPreferDisplayView() 設定播放檢視類型 mAliDisplayView.setPreferDisplayView(AliDisplayView.DisplayViewType.SurfaceView); mAliPlayer.setDisplayView(mAliDisplayView);SurfaceView
調用播放器的
setSurface介面,綁定播放器視圖。SurfaceView mSurfaceView = findViewById(R.id.surface_view); mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { mAliPlayer.setSurface(holder.getSurface()); } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { mAliPlayer.surfaceChanged(); } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { mAliPlayer.setSurface(null) } });TextureView
調用播放器的
setSurface介面,綁定播放器視圖。TextureView mTextureView = findViewById(R.id.texture_view); mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { mAliPlayer.setSurface(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) { mAliPlayer.surfaceChanged(); } @Override public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) { mAliPlayer.setSurface(null); return true; } @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { } });
設定播放源。
播放器支援4種播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要將URL設定為
artc://協議,才可以使用RTS服務。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<播流地址>"); mAliPlayer.setDataSource(urlSource);說明更多設定播放源方法,請參見基礎功能。
配置播放參數。
配置播放參數,提升超低延時直播效果。
說明6.3.0版本以及之後的播放器SDK均支援自動低延時最佳配置,當播放URL為“artc://”開頭,且客戶沒有手工修改過
PlayerConfig的mMaxDelayTime、mHighBufferDuration、mStartBufferDuration值時,SDK會自動分別使用1000、10、10值進行實際的播放。若想自訂控制,請參考如下樣本:
//1. 擷取並修改配置 PlayerConfig config = mAliPlayer.getConfig(); if (playUrl.startWith("artc://")) { //最大延時為1000毫秒 config.mMaxDelayTime = 1000; //起播緩衝時間長度,10毫秒 config.mStartBufferDuration = 10; //卡頓恢複緩衝時間長度,10毫秒 config.mHighBufferDuration = 10; } else { //config使用預設配置或自訂為其他配置 } //2. 應用配置 mAliPlayer.setConfig(config);開始播放。
// 準備播放 mAliPlayer.prepare(); // 開始播放 mAliPlayer.start();
控制播放
Android播放器SDK支援從指定時間點播放、開始、停止播放等操作。
開始播放。
指開始播放視頻,由
start介面實現。樣本如下:mAliPlayer.start();停止播放。
指停止播放視頻,由
stop介面實現。樣本如下:mAliPlayer.stop();銷毀播放器。
銷毀播放器執行個體,有同步和非同步兩種銷毀方式,樣本如下:
//同步銷毀,內部會自動調用stop介面 mAliPlayer.release(); //非同步銷毀,內部會自動調用stop介面 mAliPlayer.releaseAsync();說明調用同步銷毀介面需等待播放器資源完全釋放後才返回。如果您對介面的響應速度有較高要求,建議使用非同步銷毀介面,並注意以下幾點:
避免在非同步銷毀過程中對播放器對象執行任何其他動作。
無需在調用非同步銷毀之前手動停止播放器,因為該過程內部已經包含了非同步化的停止流程。
協助工具功能
日誌開關。
//開啟日誌 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);直播RTS降級。
說明播放失敗降級僅針對逾時情境,播放逾時情境下若配置了以下任一降級方案,則會進行降級播放處理;否則觸發播放器onError回調。例如404、403或主播斷流等異常不會觸發降級。
RTS自動降級使用相同網域名稱實現RTS至FLV降級。若您的RTS與FLV網域名稱不一樣,需配置RTS自訂降級方案以指定目標FLV網域名稱。
RTS自動降級(預設開啟)
在使用超低延時直播RTS地址播放的情境下,當未配置RTS自訂降級且RTS拉流失敗時,會自動降級到RTS對應的預設FLV地址進行播放。樣本如下:
// 1表示開啟,0表示關閉。預設開啟 AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);RTS自訂降級
在使用超低延時直播RTS地址播放的情境下,通過設定RTS的降級地址(如HLS地址或FLV地址),當RTS拉流失敗時,會自動降級到該地址播放。樣本如下:
PlayerConfig config = mAliPlayer.getConfig(); //可選,配置config其他項 UrlSource urlSource = new UrlSource(); urlSource.setUri(downgradeUrl); //設定降級URL mAliPlayer.enableDowngrade(urlSource, config);
擷取TraceID。
每一次低延時播放都會有一個traceId,可用於問題排查,可以通過播放器事件回調拿到traceid
//監聽播放器 onInfo 回調,並解析 DemuxerTraceID 訊息 mAliPlayer.setOnInfoListener(infoBean -> { if (infoBean.getCode() == InfoCode.DemuxerTraceID) { String traceId = infoBean.getExtraMsg(); });