本文介紹Android播放器SDK進階功能的使用樣本,更多功能的支援和使用請參見API說明。
專業能力確認
播放器部分功能需專業版License授權,詳情請參見播放器SDK功能詳情。如需使用,請參考擷取播放器SDK License完成授權。
在應用啟動時,或調用任意播放器介面前,設定監聽器:
import com.aliyun.private_service.PrivateService;
PrivateService.setOnPremiumLicenseVerifyCallback(new PrivateService.OnPremiumLicenseVerifyCallback() {
@Override
public void onPremiumLicenseVerifyCallback(PrivateService.PremiumBizType type, boolean isValid, String errorMsg) {
Log.d(TAG, "onPremiumLicenseVerifyCallback: " + type + " isValid: " + isValid + " errorMsg: " + errorMsg);
}
});其中,PremiumBizType為專業能力枚舉類型,使用相關功能時播放器會校正並通過該回調返回結果。若isValid為false,errorMsg將包含具體原因。
播放
列表播放
針對典型的列表播放情境,Android播放器SDK提供了完善的列表播放功能,結合預先載入等機制大幅改善短視頻的起播速度。
如果您想要擁有更好的列表播放操作體驗,推薦使用我們的微短劇解決方案,詳細內容請查看微短劇用戶端開發。
播放帶透明度視頻
功能簡介
阿里雲播放器SDK支援渲染Alpha通道,實現播放透明禮物的動態效果。在直播間等情境中,播放透明禮物動效且不會遮擋直播間內容,明顯提升使用者觀看和互動體驗。
使用限制
一體化SDK6.8.0及以後版本或播放器SDK6.9.0及以後版本支援透明渲染能力。
功能優勢
使用帶有透明度資訊的MP4視頻作為禮物特效可以提供更好的動效品質,較小的檔案體積,更高的相容性和更高的開發效率。這使得禮物特效能夠更好地展示給使用者,提升使用者體驗。
更好的動效品質:MP4視頻可以保留原始的動效品質,包括細節和顏色等,相比於其他格式,如 APN 或IXD,MP4可以更準確地還原設計師創作的動效效果。
較小的檔案體積:MP4視頻檔案相比於其他格式,如APNG或IXD,可以更有效地壓縮檔體積,提升載入速度並降低網路頻寬消耗。
更高的相容性:MP4視頻是一種通用的視頻格式,在各種裝置和瀏覽器中都得到廣泛支援,支援在主流裝置上播放和觀看禮物特效。
更高的開發效率:使用MP4視頻作為禮物特效的技術方案相對簡單,不需要開發人員去研究和實現複雜的解析和渲染邏輯,開發人員可以專註於其他功能的實現,提高開發效率。
外掛字幕
詳細程式碼範例可參考 API-Example外掛字幕示範與切換(ExternalSubtitle)模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
Android播放器SDK支援添加和切換外掛字幕,現已支援SRT、SSA、ASS、VTT這4種格式的字幕。
樣本如下:
建立顯示字幕的View。
根據不同的字幕格式建立不同的View。
當整合播放器V7.6.0及以上版本且使用
VttSubtitleView顯示SRT和VTT字幕時,需設定以下監聽://播放器7.6.0及以上版本必須 mAliPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { int viewWidth = getWidth(); int viewHeight = getHeight(); IPlayer.ScaleMode mode = mVideoListPlayer.getScaleMode(); SubTitleBase.VideoDimensions videoDimensions = SubTitleBase.getVideoDimensionsWhenRenderChanged(width, height, viewWidth, viewHeight, mode); vttSubtitleView.setVideoRenderSize(videoDimensions.videoDisplayWidth, videoDimensions.videoDisplayHeight); } });添加字幕。
重要字幕檔案需要在
onPrepared中進行設定。mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // 字幕設定(需要在 onPrepared 中進行設定) mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL); } });設定字幕相關監聽。
純音頻播放
通過禁用視頻播放,達到純音頻播放的效果。在prepare之前配置PlayerConfig。
PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; //設定開啟純音頻播放
aliPlayer.setConfig(config);軟硬解切換
解碼方式需要在播放前切換,播放中切換解碼方式將不會生效。
Android播放器SDK提供了H.264、H.265的硬解碼能力,同時提供了enableHardwareDecoder提供開關。預設開,並且在硬解初始化失敗時,自動切換為軟解,保證視頻的正常播放。樣本如下:
//開啟硬解。預設開啟
aliPlayer.enableHardwareDecoder(true);如果從硬解自動切換為軟解,將會通過onInfo回調,樣本如下:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
//切換到軟解
}
}
});H265自適應播放
當前機型包含在雲端H265黑名單機型庫或者播放H265流硬解失敗時,觸發自適應降級。具體的降級流程為:若已設定H264備流,自動播放H264備流;若未設定H264備流,則自動降級為H265軟解播放。
該功能只有在開通端雲結合自適應解碼增值服務後才會開啟。您需要提交宜搭表單申請License授權。
端雲結合自適應解碼增值服務主要包含:1、雲端硬解相容性資料動態下發;2、H265流自適應降級H264流。
SDK依然具備硬解失敗自動轉換為軟解的功能,即便未開啟增值服務。
設定備流樣本如下:
// 應用程式層維護一個Map,儲存所有原URL-備URL的索引值對,切換時根據原URL在Map中查詢備URL
AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
@Override
public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
String kurl = original_url;
if (!H265toH264Map.get(kurl).isEmpty()) {
return H265toH264Map.get(kurl);
} else {
return "";
}
}
});網路自適應切換視訊清晰度
HLS的多碼率自適應視頻流可以在ApsaraVideo for VOD中經過視頻打包轉碼模板組進行轉碼處理後產生,詳細操作請參見點播多碼率自適應配置。
經過ApsaraVideo for VOD轉碼產生的自適應流,如果使用Vid方式播放,則需要指定預設播放清晰度列表為
DEFINITION_AUTO,才會擷取並播放自適應的視頻流;否則將按照預設邏輯選擇低清晰度的視頻流進行播放,預設清晰播放順序請參見視頻轉碼了多個清晰度,播放器SDK預設會播放視頻的哪個清晰度?。以VidAuth播放方式為例,指定清晰度列表的樣本如下:VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
Android播放器SDK支援多碼率自適應HLS、DASH視頻流。在prepare成功之後,通過getMediaInfo可以擷取到各個碼流的資訊,即TrackInfo。樣本如下:
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();在播放過程中,可以通過調用播放器的selectTrack方法切換播放的碼流,取值為AUTO_SELECT_INDEX時,為多碼率自適應。樣本如下:
int index = trackInfo.getIndex();
//多碼率切換
aliPlayer.selectTrack(index);
//多碼率切換並自適應
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);切換的結果會在OnTrackChangedListener監聽之後會回調(在調用selectTrack之前設定)。樣本如下:
aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) {
//切換成功
}
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
//切換失敗。失敗原因通過errorInfo.getMsg()擷取
}
});可選:在調用播放器selectTrack方法切換播放碼流為多碼率自適應前,可以通過config設定自適應碼率(ABR)切換的清晰度上限,以避免自動切換到預期之外的碼率。樣本如下:(建議在播放器調用prepare方法,或者列表播放器調用moveTo方法前調用下述代碼,使其生效。)
PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; //設定abr清晰度上限對應的像素數量為921600(長 * 寬 = 1280 * 720),使得abr允許切換的清晰度對應的像素數量 <= 該值
aliPlayer.setConfig(config);截圖
Android播放器SDK提供了對當前視頻截圖的功能,由snapshot介面實現。截取的是原始的資料,並轉為bitmap返回。回調介面為OnSnapShotListener。樣本如下:
//設定截圖回調
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
@Override
public void onSnapShot(Bitmap bm, int with, int height){
//擷取到的bitmap以及圖片的寬高。
}
});
//截取當前播放的畫面
aliPlayer.snapshot();試看
Android播放器SDK通過配合點播服務配置,可以實現試看功能,支援VidSts和VidAuth(ApsaraVideo for VOD推薦使用此方式)兩種播放方式。如何配置和使用試看功能,請參見試看視頻。
配置試看功能之後,通過VidPlayerConfigGen.setPreviewTime()方法設定播放器的試看時間長度。以VidSts播放方式為例,樣本如下:
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);//20秒試看
vidSts.setPlayConfig(configGen);//設定給播放源
...當設定試看的時間長度,通過Android播放器SDK播放視頻時,服務端將不會返回完整的視頻內容,而是返回試看時間段的內容。
VidPlayerConfigGen支援設定服務端支援的請求參數。請參見請求參數說明。
FLV和MP3格式視頻暫時不支援試看。
設定黑名單
Android播放器SDK提供了硬解的黑名單機制。對於明確不能使用硬解播放的機器,可以直接使用軟解,避免了無效的操作。樣本如下:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );退出App之後,黑名單自動失效。
設定Referer
Android播放器SDK支援設定Referer,配合控制台的黑白名單Referer,可以控制存取權限,由PlayerConfig方法佈建要求Referer。播放器SDK的設定樣本如下:
//先擷取配置
PlayerConfig config = aliPlayer.getConfig();
//設定referer,樣本:http://example.aliyundoc.com。(注意:設定referer時,需要加上前面的協議部分。)
config.mReferrer = referrer;
....//其他設定
//設定配置給播放器
aliPlayer.setConfig(config);設定UserAgent
Android播放器SDK提供了PlayerConfig用來佈建要求UA。設定之後,播放器請求的過程中將會帶上UA資訊。樣本如下:
//先擷取配置
PlayerConfig config = aliPlayer.getConfig();
//設定UA
config.mUserAgent = "需要設定的UserAgent";
....//其他設定
//設定配置給播放器
aliPlayer.setConfig(config);配置網路重試時間和次數
支援設定Android播放器SDK的網路逾時的時間和重試次數,由PlayerConfig方法實現。樣本如下:
//先擷取配置
PlayerConfig config = aliPlayer.getConfig();
//設定網路逾時時間,單位:毫秒
config.mNetworkTimeout = 5000;
//設定逾時重試次數。每次稍候再試為networkTimeout。networkRetryCount=0則表示不重試,重試策略app決定,預設值為2
config.mNetworkRetryCount=2;
....//其他設定
//設定配置給播放器
aliPlayer.setConfig(config);如果設定了NetworkRetryCount,若此時發生網路問題,導致出現loading後,那麼將會重試NetworkRetryCount次,每次的間隔時間為mNetworkTimeout。
如果重試多次之後,還是loading的狀態,那麼就會回調
onError事件,此時,ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT。如果NetworkRetryCount設定為0,當網路重試逾時的時候,播放器就會回調
onInfo事件,事件的InfoBean.getCode()=InfoCode.NetworkRetry。 此時,可以調用播放器的reload方法進行重新載入網路,或者進行其他的處理。
配置緩衝和延遲控制
Android播放器SDK通過PlayerConfig提供了設定緩衝和延遲的控制介面。樣本如下:
設定HTTP Header
通過PlayerConfig方法,可以給播放器中的請求加上HTTP的header參數。樣本如下:
//先擷取配置
PlayerConfig config = aliPlayer.getConfig();
//定義header
String[] headers = new String[1];
headers[0]="Host:example.com";//比如需要設定Host到header中。
//設定header
config.setCustomHeaders(headers);
....//其他設定
//設定配置給播放器
aliPlayer.setConfig(config);畫中畫
詳細程式碼範例可參考 API-Example畫中畫播放(PictureInPicture)模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
操作流程如下:
在
AndroidManifest.xml檔案中,聲明畫中畫許可權。<activity android:name=".PictureInPictureActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />將目標
Activity切換到畫中畫模式。Rational aspectRatio = new Rational(16, 9); // 畫中畫的寬高比,根據自身業務可調整 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build());可以選擇從 OnClick(點擊事件)、離開應用或者返回應用時觸發畫中畫模式,實現方式如下:
OnClick(點擊事件)觸發
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Rational aspectRatio = new Rational(16, 9); // 畫中畫的寬高比 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); } });離開應用觸發
@Override protected void onUserLeaveHint() { super.onUserLeaveHint(); Rational aspectRatio = new Rational(16, 9); // 畫中畫的寬高比 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); Log.e(TAG, "畫中畫 onUserLeaveHint"); }返回應用觸發
@Override public void onBackPressed() { super.onBackPressed(); // 從返回觸發 enterPictureInPictureMode(); }處理畫中畫顯示/消失的UI。
@Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig); if (isInPictureInPictureMode) { // 進入畫中畫模式時的處理 // hide UI Log.e(TAG, "進入畫中畫模式"); } else { // 退出畫中畫模式時的處理 // show UI Log.e(TAG, "退出畫中畫模式"); } }
直播RTS降級
詳細程式碼範例可參考 API-ExampleRTS超低延遲直播播放(RtsLiveStream)模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
詳情請參見RTS直播播放。
切換左右聲道
Android播放器SDK通過setOutputAudioChannel方法設定輸出聲道,如果輸入源是雙聲道,則支援通過下述方法切換為左聲道或右聲道;如果輸入源是單聲道,則設定無效。
下述輸出聲道的設定會同時影響音頻渲染及PCM資料回調。
/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT 切換到左聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT 切換到右聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE 不切換聲道,保持輸入源聲道播放
*/
aliPlayer.setOutputAudioChannel();解析音頻流
設定監聽,可擷取音視頻流資料。音視頻不能是加密流,加密流無法解析。
設定視頻背景色
Android播放器SDK支援設定播放器渲染的背景色。介面和用法說明如下:
介面樣本
/**
* 設定視頻的背景色
*
* @param color ARGB
*
*/
/****
* Set video background color
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);用法說明
//參數為8位16進位資料,8位元據兩兩為一組,按照順序分別表示A(alpha 透明度) R(red) G(green) B(blue)
//例如0x0000ff00,表示綠色
aliPlayer.setVideoBackgroundColor(0x0000ff00);vidAuth設定指定播放網域名稱
通過vidAuth方式可以指定vid對應的網域名稱等欄位,支援的欄位詳情請參見GetPlayInfo請求參數。介面及用法說明如下:
介面樣本
/**
* 設定播放參數
*
* @param playConfig 播放參數
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);用法說明
通過其中的VidPlayerConfigGen介面的addPlayerConfig添加playDomain欄位。
vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
//增加playDomain欄位,可以添加的欄位參考
//https://www.alibabacloud.com/help/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);H.266解碼外掛程式
H.266(VVC/Versatile Video Coding)作為新一代視頻編碼通訊協定,能在同等畫質下大幅節省碼率。為最佳化效能並控制主SDK體積,H.266增值解碼能力以外掛程式形式獨立封裝,支援按需整合。
前提條件
播放器/一體化SDK為V7.6.0及以上版本。
已完成專業版License授權,詳情請參見擷取播放器SDK License。
阿里雲播放器搭配H.266解碼外掛程式僅支援播放阿里雲轉碼的H.266視頻。
整合外掛程式
啟用外掛程式
自Android播放器SDK7.7.0起,外掛程式整合後預設啟用,無需手動啟用。
AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);相關錯誤碼
H.266解碼外掛程式相關錯誤碼請參見各端播放器公用常見問題。
自動重新整理播放源
啟用播放源自動重新整理功能可防止鑒權機制下到期導致的播放中斷,此功能會在源失效時觸發監聽並擷取新地址,確保視頻持續流暢播放。
前提條件
播放器/一體化SDK為V7.9.0及以上版本。
使用VidAuth源進行播放或業務配置了URL鑒權。
VidAuth源
介面樣本
/**
* 設定 VidAuth 源到期監聽器。
*
* 此功能用於啟用 VidAuth 源到期重新整理機制,防止 VidAuth 源鑒權到期導致的視頻播放中斷。
* 當監聽器被觸發時,您可以重新整理 VidAuth 源,並通過 {@link SourceRefreshCallback#onSuccess} 提交新的 VidAuth 源,
* 以確保視頻播放穩定和流暢。
*
* @param listener 監聽 VidAuth 源到期事件的介面。見 {@link OnVidAuthExpiredListener}。
*/
/****
* Sets the listener for VidAuth source expiration events.
*
* This feature enables automated VidAuth source refresh to avoid playback interruptions
* caused by expiration. When the listener is triggered, you can refresh the VidAuth source
* and return the updated VidAuth using {@link SourceRefreshCallback#onSuccess}.
*
* @param listener The interface for listening to VidAuth source expiration events. See {@link OnVidAuthExpiredListener}.
*
*/
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);功能組成
UrlSource源
介面樣本
/**
* 設定 URL 源到期監聽器。
*
* 此功能用於啟用 URL 源到期重新整理機制,避免由於鑒權等導致的 URL 源到期情況,引發播放中斷。
* 當監聽器觸發時,您可以重新整理 URL 源並通過 {@link SourceRefreshCallback#onSuccess} 提交新的 URL 源,
* 以確保視頻播放持續流暢。
*
* @param listener 用於處理 URL 源到期事件的監聽器。見 {@link OnURLSourceExpiredListener}。
*
* <p>關於 URL 鑒權機制的配置,請參考:<a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL 鑒權文檔</a></p>
*/
/****
* Sets the listener for URL source expiration events.
*
* This feature enables URL refresh to avoid playback interruptions caused by
* URL expiration due to authentication. When the listener is triggered,
* you can refresh the URL source and return the updated URL source using {@link SourceRefreshCallback#onSuccess}.
*
* @param listener Listener for handling URL source expiration events. See {@link OnURLSourceExpiredListener}.
*
* <p>For more information on configuring URL authentication, see
* <a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL authentication documentation</a>.</p>
*/
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);功能組成
工具函數補充
以鑒權方式A為例。
效能
設定播放情境
設定播放情境會根據情境自動設定最佳參數(包括buffer設定、功能開關等),同時相容通過setConfig介面自訂的參數設定(以自訂設定為準)。
設定播放情境後可通過
getConfig介面查看參數配置。
介面樣本
/**
* 設定播放器情境
*
* @param scene
*/
/****
* Set the player scene.
*
* @param scene.
*/
abstract public void setPlayerScene(PlayerScene scene);播放情境
public enum PlayerScene {
/**
* 情境:無
*/
/****
* scene none
*/
NONE,
/**
* 長視頻情境:適用於30min以上
*/
/****
* long scene: apply to more than 30min
*/
LONG,
/**
* 中視頻情境:適用於5min-30min
*/
/****
* middle scene: apply to 5min-30min
*/
MEDIUM,
/**
* 短視頻情境:適用於0s-5min
*/
/****
* short scene: apply to 0s-5min
*/
SHORT,
/**
* 直播情境
*/
/****
* live scene
*/
LIVE,
/**
* 超低延遲直播情境
*/
/****
* RTS live scene
*/
RTS_LIVE
}用法說明
//設定短視頻情境
aliPlayer.setPlayerScene(PlayerScene.SHORT)
//設定中視頻情境
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)
//設定長視頻情境
aliPlayer.setPlayerScene(PlayerScene.LONG)
//設定直播情境
aliPlayer.setPlayerScene(PlayerScene.LIVE)預渲染
Android播放器SDK支援在起播之前快速渲染第一幀,可以提高起播速度。
該功能預設關閉。
功能開啟後會影響準備成功與首幀渲染事件的觸發順序:未開啟時先回調準備成功再回調首幀渲染事件;開啟後因解碼渲染速度不同,存在首幀渲染先於準備成功事件觸發的情況,但不影響播放。
樣本如下:
aliPlayer.setOption(ALLOW_PRE_RENDER, 1);本機快取
詳細程式碼範例可參考 API-Example視頻預先載入(Preload)模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
Android播放器SDK提供了本機快取的功能,能夠讓使用者重複播放視頻時,提高起播速度、提高seek速度、減少卡頓,也能達到節省流量的目的。
開啟本機快取
本機快取功能預設關閉,如需使用,需要手動開啟。通過AliPlayerGlobalSettings中的enableLocalCache控制。樣本如下:
如果視頻播放URL帶有鑒權參數,本機快取和播放時鑒權參數會變化,為提高相同URL在不同鑒權下的快取命中率,可以將URL的鑒權參數去掉後再通過
setCacheUrlHashCallback介面計算Hash值(例如MD5)。例如:帶有鑒權參數的視頻播放URL為http://****.mp4?aaa,則載入時使用http://****.mp4計算Hash值。但如果視頻為經過加密後的m3u8視頻,其keyURL若按照去掉鑒權參數再計算Hash值的方式處理,會導致不同視頻的快取命中同一個key導致播放失敗。解決方案:您可以在setCacheUrlHashCallback的回調裡進行網域名稱判斷,僅對播放網域名稱(http(s)://xxxxx.m3u8?aaaa)做去掉鑒權參數的處理,而keyURL對應的網域名稱(http(s)://yyyyy?bbbb)不做去掉鑒權參數的處理。
如果伺服器同時支援HTTP和HTTPS協議,但是不同的協議指向的媒體檔案是同一個,則可以將要求標頭去掉或者統一後再計算Hash值。例如:
視頻播放URL為
https://****.mp4和http://****.mp4,則載入時使用****.mp4計算hash值。視頻播放URL為
https://****.mp4,載入時統一為http://****.mp4後再計算Hash值。
針對5.5.4.0及以後版本的播放器SDK,如果視頻播放URL帶有鑒權參數且播放協議為HLS,可以通過設定
PlayerConfig.mEnableStrictAuthMode欄位,進行不同鑒權模式的選擇(5.5.4.0至6.21.0版本預設值為false;7.0.0及以上版本預設值為true):非嚴格鑒權(false):鑒權也緩衝,若上一次只緩衝了部分媒體,下次播放至非緩衝部分時,播放器會用緩衝的鑒權發起請求,如果URL鑒權設定的有效期間很短,會導致播放異常。
嚴格鑒權(true):鑒權不緩衝,每次起播都進行鑒權,無網路下會導致起播失敗。
開啟或關閉單個URL的本機快取
如果想要針對單個URL開啟或關閉本機快取功能,可以在player config中設定。
//先擷取配置
PlayerConfig config = aliPlayer.getConfig();
//是否針對播放的URL開啟本機快取,預設值為true。當AliPlayerGlobalSettings處的本地緩開啟時,且同時開啟此處的本機快取,即設定為true,該URL的本機快取才會生效;若此處設定為false,則關閉該URL的本機快取。
config.mEnableLocalCache = false;
....//其他設定
//設定配置給播放器
aliPlayer.setConfig(config);預先載入
Android播放器SDK提供預先載入功能,是對本機快取功能的升級,通過設定視頻緩衝的記憶體佔用大小,更能提升視頻的起播速度。
預先載入功能的使用限制如下:
目前支援MP4、MP3、FLV、HLS等單個媒體檔案的載入。
Android播放器SDK預設提供預先載入時網路資源自動調度能力,以減少預先載入的網路請求對現正播放視頻的網路請求的影響。自動調度的策略是:僅當現正播放的視頻緩衝到達一定閾值後,才會允許預先載入進行請求。若您需要自行控制預先載入的即時請求,可以通過以下方法將此策略關閉:
AliPlayerGlobalSettings.enableNetworkBalance(false);開啟本機快取功能,詳細操作請參見本機快取。
設定資料來源。
VidAuth(推薦)
VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid資訊");// 必選參數,視頻ID(VideoId)。 vidAuth.setPlayAuth("<yourPlayAuth>");// 必選參數,播放憑證,需要調用點播服務的GetVideoPlayAuth介面產生。 vidAuth.setRegion("接入地區");// 5.5.5.0及之後版本播放器SDK,本參數已棄用,無需設定region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數必選,點播服務的接入地區,預設為cn-shanghai。 vidAuth.setQuality("選擇的清晰度") //"AUTO"代表自適應碼率VidSts
VidSts vidSts = new VidSts(); vidSts.setVid("Vid資訊");// 必選參數,視頻ID(VideoId)。 vidSts.setAccessKeyId("<yourAccessKeyId>");// 必選參數,STS臨時AK對的存取金鑰ID,需要調用STS服務的AssumeRole介面產生。 vidSts.setAccessKeySecret("<yourAccessKeySecret>");// 必選參數,STS臨時AK對的存取金鑰,需要調用STS服務的AssumeRole介面產生。 vidSts.setSecurityToken("<yourSecurityToken>");// 必選參數,STS安全性權杖,需要調用STS服務的AssumeRole介面產生。 vidSts.setRegion("接入地區");// 必選參數,點播服務的接入地區,預設為cn-shanghai。 vidSts.setQuality("選擇的清晰度") //"AUTO"代表自適應碼率UrlSource
UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");// 必選參數,播放地址,可以是第三方點播地址,或阿里雲ApsaraVideo for VOD服務中的播放地址。設定任務參數。
說明僅適用於多碼率視頻,
setDefaultBandWidth、setDefaultResolution、setDefaultQuality三者任選其一即可。PreloadConfig preloadConfig = new PreloadConfig(); // 多碼率流下設定預先載入碼率 preloadConfig.setDefaultBandWidth(400000); // 多碼率流下設定預先載入解析度 preloadConfig.setDefaultResolution(640 * 480); // 多碼率流下設定預先載入品質 preloadConfig.setDefaultQuality(“FD”); // 設定預先載入時間長度 preloadConfig.setDuration(1000);新增工作監聽器。
構建任務並添加到
MediaLoaderV2執行個體,開始預先載入。VidAuth(推薦)
//構建預先載入 PreloadTask mPreloadTask = new PreloadTask(vidAuth, preloadConfig); //擷取MediaLoaderV2執行個體 MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance(); //新增工作並開始預先載入 String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)VidSts
//構建預先載入 PreloadTask mPreloadTask = new PreloadTask(vidSts, preloadConfig); //擷取MediaLoaderV2執行個體 MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance(); //新增工作並開始預先載入 String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl);UrlSource
//構建預先載入 PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig); //擷取MediaLoaderV2執行個體 MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance(); //新增工作並開始預先載入 String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)可選:管理工作。
mediaLoaderV2.cancelTask(taskId);//取消指定任務ID預先載入任務 mediaLoaderV2.pauseTask(taskId);//暫停指定任務ID預先載入任務 mediaLoaderV2.resumeTask(taskId);//恢複指定任務ID預先載入任務可選:刪除負載檔案。
可按需刪除負載檔案,以節省空間的。Android播放器SDK不提供刪除介面,需要在App刪除載入目錄下的檔案。
動態預先載入
動態預先載入策略,支援整合方既可以控制當前現正播放視頻的緩衝,又可以控制預先載入的個數和緩衝,滿足業務方對播放體驗與成本開銷之間取得平衡的訴求。
多碼率HLS視頻預先載入
在listPlayer+多碼率HLS視頻播放情境下,支援整合方預先載入與當前播放清晰度一致的流,並且可以根據業務情況選擇預先載入模式。
擷取下載速度
擷取當前播放視頻的下載速度,在onInfo回調中擷取,由getExtraValue介面實現。樣本如下:
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
//當前下載速度
long extraValue = infoBean.getExtraValue();
}
}
});網路特性
HTTPDNS
HTTPDNS是通過DNS解析技術將網域名稱解析請求發送到特定的HTTPDNS伺服器,以擷取更快、更穩定的網域名稱解析結果,降低DNS劫持風險。
阿里雲播放器SDK提供增強型HTTPDNS功能,專為阿里雲CDN網域名稱提供HTTPDNS服務,支援阿里雲CDN網路精準調度、即時解析生效,有效提高網路效能。
增強型HTTPDNS使用樣本
增強型HTTPDNS僅為阿里雲CDN網域名稱提供HTTPDNS服務,請確保您配置的網域名稱為阿里雲CDN網域名稱且已完成網域名稱配置可正常使用。ApsaraVideo for VOD中添加和配置CDN網域名稱請參見添加加速網域名稱。更多有關CDN網域名稱的資訊請參見阿里雲CDN。
//開啟增強型httpdns
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
//可選,增加httpdns預解析網域名稱
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");HTTP/2
Android播放器SDK自5.5.0.0版本開始預設開啟使用HTTP/2。
Android播放器SDK支援使用HTTP/2協議,該協議通過多工,避免隊頭阻塞,以改善播放效能。樣本如下:
AliPlayerGlobalSettings.setUseHttp2(true);HTTP預建連TCP
針對HTTP的視頻播放請求(非HTTPS),通過提前建立TCP串連能夠顯著改善使用者體驗,降低網路連接耗時,確保播放的即時性與連續性,同時最佳化網路和系統資源的使用效率。使用方式如下:
// domain格式為host[:port],port可選,用分號(;)隔開多個網域名稱
// 全域設定
// 全量介面每次設定後使用當前的字串為準(多-新增,少-刪除),字串空為停止預建連
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");視頻下載
詳細程式碼範例可參考 API-Example視頻下載與離線播放(Download)模組,該工程是基於Java的阿里雲播放器SDK Android樣本工程,能夠協助開發人員快速掌握SDK核心功能整合。
Android播放器SDK提供了點播服務視頻的下載功能,允許使用者通過阿里雲播放器將視頻緩衝至本地觀看。同時,提供了普通下載和安全下載兩種下載方式。
普通下載
下載後的視頻資料未經過阿里雲加密,使用者可以用第三方播放器播放。
安全下載
下載後的視頻資料經過阿里雲加密。第三方播放器無法播放。僅支援使用阿里雲的播放器進行播放。
使用說明
僅VidSts和VidAuth方式可使用視訊下載功能。
使用播放器的視頻下載功能,需要在點播控制台開啟並配置下載模式,詳細操作請參見離線下載。
視頻下載支援斷點續傳。
操作步驟
可選:配置安全下載的加密校正檔案。僅安全下載需要配置,普通下載無需配置。
說明請確保配置的加密校正檔案與App資訊一致,否則會導致視頻下載失敗。
如果設定為安全下載方式,則需要將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載和播放的解密驗證,密鑰檔案的產生請參見開啟安全下載。
建議在Application中配置一次即可,樣本如下:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat所在的檔案路徑"); //建議將encryptedApp.dat加密校正檔案存放到手機中後,此處設定加密校正檔案的手機本地檔案路徑建立並設定下載器。
建立下載器,通過AliDownloaderFactory建立。樣本如下:
AliMediaDownloader mAliDownloader = null; ...... //建立下載器 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); //配置下載儲存的路徑 mAliDownloader.setSaveDir("儲存的檔案夾地址");設定監聽事件。
下載器提供了多個事件監聽。樣本如下:
準備下載源。
通過
prepare方法準備下載源。下載源支援VidSts和VidAuth兩種方式。樣本如下:VidSts
//建立VidSts VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("Vid資訊");// 視頻ID(VideoId)。 aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");// STS臨時AK對的存取金鑰ID,需要調用STS服務的AssumeRole介面產生。 aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>");// STS臨時AK對的存取金鑰,需要調用STS服務的AssumeRole介面產生。 aliyunVidSts.setSecurityToken("<yourSecurityToken>");// STS安全性權杖,需要調用STS服務的AssumeRole介面產生。 aliyunVidSts.setRegion("接入地區");// 點播服務的接入地區,預設為cn-shanghai。 //若您在VOD控制台開啟了HLS標準加密參數透傳,且預設的參數名為MtsHlsUriToken,那麼需要設定config,並將其傳入vid中,參考下述 //若您未在VOD控制台開啟了HLS標準加密參數透傳,那麼則不需要整合下述代碼 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); aliyunVidSts.setPlayerConfig(config); //準備下載源 mAliDownloader.prepare(aliyunVidSts)VidAuth
//建立VidAuth VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid資訊");// 視頻ID(VideoId)。 vidAuth.setPlayAuth("<yourPlayAuth>");// 播放憑證,需要調用點播服務的GetVideoPlayAuth介面產生。 vidAuth.setRegion("接入地區");// 5.5.5.0及之後版本播放器SDK,本參數已棄用,無需設定region,播放器會自動解析region;5.5.5.0之前版本播放器SDK,本參數必選,點播服務的接入地區,預設為cn-shanghai。 //若您在VOD控制台開啟了HLS標準加密參數透傳,且預設的參數名為MtsHlsUriToken,那麼需要設定config,並將其傳入vid中,參考下述 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); vidAuth.setPlayerConfig(config); //準備下載源 mAliDownloader.prepare(vidAuth);
說明源檔案格式與輸出的下載檔案格式保持一致,不支援更改。
若您在VOD控制台開啟HLS標準加密參數透傳,預設的參數名為MtsHIsUriToken,詳情見HLS標準加密參數透傳,那麼請按照上述代碼,將MtsHIsUriToken值設入點播源中。
準備成功後,選擇下載項並開始下載。
準備成功後,會回調
OnPreparedListener方法。返回的TrackInfo中會包含各視頻流的清晰度等資訊,請選擇一個Track進行下載,樣本如下:public void onPrepared(MediaInfo mediaInfo) { //準備下載項成功 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); //比如:下載第一個TrackInfo mAliDownloader.selectItem(trackInfos.get(0).getIndex()); //開始下載 mAliDownloader.start(); }(可選)更新下載源。
為了防止VidSts和VidAuth到期,您也可以更新下載源的資訊後開始下載。樣本如下:
//更新下載源 mAliDownloader.updateSource(VidSts); //開始下載 mAliDownloader.start();下載成功或失敗後,釋放下載器。
下載成功後,在
onCompletion或者onError回調中調用release釋放下載器。樣本如下:mAliDownloader.stop(); mAliDownloader.release();可選:刪除下載的檔案。
下載過程中,或者下載完成後,可以刪除下載的檔案。樣本如下:
//通過對象刪除檔案 mAliDownloader.deleteFile(); //通過靜態方法刪除,若刪除成功則返回0 AliDownloaderFactory.deleteFile("待刪除的下載檔案夾路徑","視頻ID","視頻格式","下載的視頻索引");
後續操作
下載的視頻可以使用阿里雲播放器進行播放。具體方法如下:
下載完成後擷取視頻檔案的絕對路徑。
String path = mAliDownloader.getFilePath();通過點播UrlSource方式設定絕對路徑進行播放。
UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");//設定下載視頻的絕對路徑。 aliPlayer.setDataSource(urlSource);
視頻加密播放
點播視訊支援HLS標準加密、阿里雲私人加密和DRM加密,直播視頻僅支援DRM加密。加密播放請參見視頻加密播放。
Native RTS播放
Android播放器SDK整合Native RTS SDK實現Native端低延時直播功能,詳情請參見Android端實現RTS拉流。