通過閱讀本文,您可以瞭解Android端阿里雲播放器SDK整合Native RTS SDK實現超低延時直播的方法。
SDK整合
添加阿里雲播放器SDK和Native RTS SDK的依賴檔案,有以下兩種方式:
阿里雲播放器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("\\", ""); } }