本文介紹Android播放器SDK進階功能的使用示例,更多功能的支持和使用請參見API說明。
播放
列表播放
針對典型的列表播放場景,Android播放器SDK提供了完善的列表播放功能,結合預加載等機制大幅改善短視頻的起播速度。
操作步驟
如果您想要擁有更好的列表播放操作體驗,推薦使用我們的微短劇解決方案,詳細內容請查看微短劇AUIKit。
播放帶透明度視頻
功能簡介
阿里云播放器SDK支持渲染Alpha通道,實現播放透明禮物的動態效果。在直播間等場景中,播放透明禮物動效且不會遮擋直播間內容,明顯提升用戶觀看和互動體驗。
使用限制
一體化SDK6.8.0及以后版本或播放器SDK6.9.0及以后版本支持透明渲染能力。
功能優勢
使用帶有透明度信息的MP4視頻作為禮物特效可以提供更好的動效質量,較小的文件體積,更高的兼容性和更高的開發效率。這使得禮物特效能夠更好地展示給用戶,提升用戶體驗。
更好的動效質量:MP4視頻可以保留原始的動效質量,包括細節和顏色等,相比于其他格式,如 APN 或IXD,MP4可以更準確地還原設計師創作的動效效果。
較小的文件體積:MP4視頻文件相比于其他格式,如APNG或IXD,可以更有效地壓縮文件體積,提升加載速度并降低網絡帶寬消耗。
更高的兼容性:MP4視頻是一種通用的視頻格式,在各種設備和瀏覽器中都得到廣泛支持,支持在主流設備上播放和觀看禮物特效。
更高的開發效率:使用MP4視頻作為禮物特效的技術方案相對簡單,不需要開發人員去研究和實現復雜的解析和渲染邏輯,開發人員可以專注于其他功能的實現,提高開發效率。
示例代碼
新增如下接口:設置alpha模式(alpha通道在視頻素材的方位:上、下、左、右),默認值是None。
素材的alpha通道的位置要與setAlphaRenderMode參數設置的一致。
playerview的大小要與素材的分辨率成比例。
/**
* 設置Alpha渲染模式
*
* @param alphaRenderMode 鏡像模式。見{@link AlphaRenderMode}。
*/
/****
* Set a alpha render mode
*
* @param alphaRenderMode The specified alpha render mode. See {@link AlphaRenderMode}.
*/
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------View用法-------------
// 對于View需要設置透明
//TextureView
TextureView aliplayerView; //用于播放的 view
aliplayerView.setOpaque(false);
//SurfaceView
SurfaceView aliplayerView; //用于播放的 view
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); //把SurfaceView置于顯示窗口的最頂層
//-----------AliPlayer用法-----------
//設置alpha模式
aliplayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
//設置alpha模式對應的素材
UrlSource urlSource = new UrlSource();
urlSource.setUri("https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%E6%A0%B7%E6%9C%AC/alpha%E9%80%9A%E9%81%93/alpha_right.mp4");
aliplayer.setDataSource(urlSource);
aliplayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
@Override
public void onCompletion() {
//可選:單實例播放完成后如果有銜接問題,可以清屏
aliplayer.clearScreen();
}
}
aliplayer.setAutoPlay(true);
aliplayer.prepare();
外掛字幕
Android播放器SDK支持添加和切換外掛字幕,現已支持SRT、SSA、ASS、VTT這4種格式的字幕。示例如下:
創建顯示字幕的View。
根據不同的字幕格式創建不同的View。
//用于顯示SRT和VTT字幕 SubtitleView subtitleView = new SubtitleView(getContext()); //用于顯示ASS和SSA字幕 AssSubtitleView assSubtitleView = new AssSubtitleView(getContext()); //將字幕View添加到布局視圖中 viewGroup.addView(assSubtitleView);
設置字幕相關監聽。
mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleExtAdded(int trackIndex, String url) { } @Override public void onSubtitleShow(int trackIndex, long id, String data) { // ass 字幕 assSubtitleView.show(id,data); // srt 字幕 SubtitleView.Subtitle subtitle = new SubtitleView.Subtitle(); subtitle.id = id + ""; subtitle.content = data; subtitleView.show(subtitle); } @Override public void onSubtitleHide(int trackIndex, long id) { // ass 字幕 assSubtitleView.dismiss(id); // srt 字幕 subtitleView.dismiss(id + ""); } @Override public void onSubtitleHeader(int trackIndex, String header) { } });
添加字幕。
mAliPlayer.addExtSubtitle(url);
顯示或隱藏字幕。
在收到
onSubtitleExtAdded
回調后,可通過如下方法進行顯示或隱藏字幕://trackIndex:傳入字幕索引;true:表示顯示傳入的字幕;false:表示隱藏傳入的字幕 mAliPlayer.selectExtSubtitle(trackIndex, true);
純音頻播放
通過禁用視頻播放,達到純音頻播放的效果。在prepare之前配置PlayerConfig。
PlayerConfig config = mAliPlayer.getConfig();
config.mDisableVideo = true; //設置開啟純音頻播放
mAliPlayer.setConfig(config);
軟硬解切換
解碼方式需要在播放前切換,播放中切換解碼方式將不會生效。
Android播放器SDK提供了H.264、H.265的硬解碼能力,同時提供了enableHardwareDecoder
提供開關。默認開,并且在硬解初始化失敗時,自動切換為軟解,保證視頻的正常播放。示例如下:
//開啟硬解。默認開啟
mAliyunVodPlayer.enableHardwareDecoder(true);
如果從硬解自動切換為軟解,將會通過onInfo
回調,示例如下:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
//切換到軟解
}
}
});
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的多碼率自適應視頻流可以在視頻點播中經過視頻打包轉碼模板組進行轉碼處理后生成,詳細操作請參見點播多碼率自適應配置。
經過視頻點播轉碼生成的自適應流,如果使用Vid方式播放,則需要指定默認播放清晰度列表為
DEFINITION_AUTO
,才會獲取并播放自適應的視頻流;否則將按照默認邏輯選擇低清晰度的視頻流進行播放,默認清晰播放順序請參見清晰度相關問題。以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 = aliyunVodPlayer.getMediaInfo().getTrackInfos();
在播放過程中,可以通過調用播放器的selectTrack
方法切換播放的碼流,取值為AUTO_SELECT_INDEX時,為多碼率自適應。示例如下:
int index = trackInfo.getIndex();
//多碼率切換
aliyunVodPlayer.selectTrack(index);
//多碼率切換并自適應
aliyunVodPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
切換的結果會在OnTrackChangedListener
監聽之后會回調(在調用selectTrack
之前設置)。示例如下:
aliyunVodPlayer.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 = mAliyunVodPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; //設置abr清晰度上限對應的像素數量為921600(長 * 寬 = 1280 * 720),使得abr允許切換的清晰度對應的像素數量 <= 該值
mAliyunVodPlayer.setConfig(config);
截圖
Android播放器SDK提供了對當前視頻截圖的功能,由snapshot
接口實現。截取的是原始的數據,并轉為bitmap
返回。回調接口為OnSnapShotListener
。示例如下:
//設置截圖回調
aliyunVodPlayer.setOnSnapShotListener(new OnSnapShotListener(){
@Override
public void onSnapShot(Bitmap bm, int with, int height){
//獲取到的bitmap以及圖片的寬高。
}
});
//截取當前播放的畫面
aliyunVodPlayer.snapshot();
試看
Android播放器SDK通過配合點播服務配置,可以實現試看功能,支持VidSts和VidAuth(視頻點播推薦使用此方式)兩種播放方式。如何配置和使用試看功能,請參見試看視頻。
配置試看功能之后,通過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 = mAliyunVodPlayer.getConfig();
//設置referer,示例:http://example.aliyundoc.com。(注意:設置referer時,需要加上前面的協議部分。)
config.mReferrer = referrer;
....//其他設置
//設置配置給播放器
mAliyunVodPlayer.setConfig(config);
設置UserAgent
Android播放器SDK提供了PlayerConfig
用來設置請求UA。設置之后,播放器請求的過程中將會帶上UA信息。示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//設置UA
config.mUserAgent = "需要設置的UserAgent";
....//其他設置
//設置配置給播放器
mAliyunVodPlayer.setConfig(config);
配置網絡重試時間和次數
支持設置Android播放器SDK的網絡超時的時間和重試次數,由PlayerConfig
方法實現。示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//設置網絡超時時間,單位:毫秒
config.mNetworkTimeout = 5000;
//設置超時重試次數。每次重試間隔為networkTimeout。networkRetryCount=0則表示不重試,重試策略app決定,默認值為2
config.mNetworkRetryCount=2;
....//其他設置
//設置配置給播放器
mAliyunVodPlayer.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 = mAliyunVodPlayer.getConfig();
//定義header
String[] headers = new String[1];
headers[0]="Host:example.com";//比如需要設置Host到header中。
//設置header
config.setCustomHeaders(headers);
....//其他設置
//設置配置給播放器
mAliyunVodPlayer.setConfig(config);
直播RTS降級
RTS自動降級
在使用超低延時直播RTS地址播放的場景下,當不設置RTS降級地址且RTS拉流失敗時,會自動降級到RTS對應的默認flv地址進行播放。示例如下:
// 1表示開啟,0表示關閉。默認開啟
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);
RTS自定義降級
在使用超低延時直播RTS地址播放的場景下,通過設置RTS的降級地址(如HLS地址或FLV地址),當RTS拉流失敗時,會自動降級到該地址播放。示例如下:
PlayerConfig config = player.getConfig();
//可選,配置config其他項
UrlSource urlSource = new UrlSource();
urlSource.setUri(downgradeUrl);
//設置降級URL
player.enableDowngrade(urlSource, config);
切換左右聲道
Android播放器SDK通過player.setOutputAudioChannel
方法設置輸出聲道,如果輸入源是雙聲道,則支持通過下述方法切換為左聲道或右聲道;如果輸入源是單聲道,則設置無效。
下述輸出聲道的設置會同時影響音頻渲染及PCM數據回調。
/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT 切換到左聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT 切換到右聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE 不切換聲道,保持輸入源聲道播放
*/
player.setOutputAudioChannel();
解析音頻流
設置監聽,可獲取音視頻流數據。音視頻不能是加密流,加密流無法解析。
//可選配置1:是否返回底層數據的地址
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true;//是否只返回底層視頻數據地址
config.mAudioDataAddr = true;//是否只返回底層音頻數據地址
player.setRenderFrameCallbackConfig(config);
//可選配置2:硬解時,RenderFrame返回 texture_oes_id,軟解時,RenderFrame返回源數據
player.enableHardwareDecoder(true);
//設置監聽,獲取音視頻數據
player.setOnRenderFrameCallback(frameInfo -> {
if (frameInfo.frameType == FrameInfo.FrameType_video) {
//視頻數據
} else {
//音頻數據
}
return false;
});
設置視頻背景色
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,表示綠色
player.setVideoBackgroundColor(0x0000ff00);
vidAuth設置指定播放域名
通過vidAuth方式可以指定vid對應的域名等字段,支持的字段詳情請參見GetPlayInfo請求參數。接口及用法說明如下:
接口示例
/**
* 設置播放參數
*
* @param playConfig 播放參數
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);
用法說明
通過其中的VidPlayerConfigGen接口的addPlayerConfig添加playDomain字段。
vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
//增加playDomain字段,可以添加的字段參考
//http://bestwisewords.com/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo?spm=a2c4g.11186623.0.0.2bec2e44eqeDgx#api-detail-35
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);
性能
預渲染
Android播放器SDK支持在起播之前快速渲染第一幀。示例如下:
player.setOption(ALLOW_PRE_RENDER, 1);
本地緩存
Android播放器SDK提供了本地緩存的功能,能夠讓用戶重復播放視頻時,提高起播速度、提高seek速度、減少卡頓,也能達到節省流量的目的。
開啟本地緩存
本地緩存功能默認關閉,如需使用,需要手動開啟。通過AliPlayerGlobalSettings
中的enableLocalCache
控制。示例如下:
/**
* 開啟本地緩存,開啟之后,會緩存到本地文件中。
*
* @param enable - 本地緩存功能開關。true:開啟本地緩存,false:關閉,默認關閉。
* @param maxBufferMemoryKB - 5.4.7.1及以后版本已廢棄,暫無作用
* @param localCacheDir - 本地緩存的文件目錄,為絕對路徑。
*/
public static void enableLocalCache(boolean enable,
int maxBufferMemoryKB,
java.lang.String localCacheDir)
/**
* 本地緩存文件清理相關配置。
*
* @param expireMin - 5.4.7.1及以后版本已廢棄,暫無作用。
* @param maxCapacityMB - 最大緩存容量。單位:兆,默認值20GB,在清理時,如果緩存總容量超過此大小,則會以cacheItem為粒度,按緩存的最后時間排序,一個一個的刪除最舊的緩存文件,直到小于等于最大緩存容量。
* @param freeStorageMB - 磁盤最小空余容量。單位:兆,默認值0,在清理時,同最大緩存容量,如果當前磁盤容量小于該值,也會按規則一個一個的刪除緩存文件,直到freeStorage大于等于該值或者所有緩存都被清理掉。
*/
public static void setCacheFileClearConfig(long expireMin,
long maxCapacityMB,
long freeStorageMB)
/**
* 設置加載url的hash值回調。如果不設置,SDK使用md5算法。
*/
public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
如果視頻播放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
字段,進行不同鑒權模式的選擇(默認值為false):非嚴格鑒權(false):鑒權也緩存,若上一次只緩存了部分媒體,下次播放至非緩存部分時,播放器會用緩存的鑒權發起請求,如果URL鑒權設置的有效期很短,會導致播放異常。
嚴格鑒權(true):鑒權不緩存,每次起播都進行鑒權,無網絡下會導致起播失敗。
開啟或關閉單個URL的本地緩存
如果想要針對單個URL開啟或關閉本地緩存功能,可以在player config
中設置。
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//是否針對播放的URL開啟本地緩存,默認值為true。當AliPlayerGlobalSettings處的本地緩開啟時,且同時開啟此處的本地緩存,即設置為true,該URL的本地緩存才會生效;若此處設置為false,則關閉該URL的本地緩存。
config.mEnableLocalCache = false;
....//其他設置
//設置配置給播放器
mAliyunVodPlayer.setConfig(config);
使用默認緩存路徑
如果想要使用默認路徑進行緩存,可以通過AliPlayerGlobalSettings
進行如下設置。
/**
* 開啟本地緩存,開啟之后,就會緩存到本地文件中。
* @param enable true:開啟本地緩存。false:關閉。默認關閉。
*/
/****
* Enable local cache. When enabled, it will be cached in local files.
* @param enable true: enables the local cache. false: disable. This function is disabled by default.
* @param context The context.
*/
public static String enableLocalCache(boolean enable, Context context)
大緩存
通過設置數據的最大緩沖區時長可以在播放視頻時通過緩存視頻數據到內存中,從而提高播放性能和觀看體驗。當最大緩沖區時長設置過大時,會造成緩沖區對內存的消耗。通過啟用大緩存,可以將視頻數據緩存到文件中,從而降低內存的占用,進一步提高播放器性能。
當mMaxBufferDuration設置超過50000 ms時,通過開啟本地緩存觸發大緩存功能自動啟用。操作流程如下:
預加載
Android播放器SDK提供預加載功能,是對本地緩存功能的升級,通過設置視頻緩存的內存占用大小,更能提升視頻的起播速度。
預加載功能的使用限制如下:
目前支持MP4、MP3、FLV、HLS等單個媒體文件的加載。
僅支持UrlSource播放方式播放視頻的預加載,暫不支持VidAuth、VidSts方式播放視頻的預加載。
Android播放器SDK默認提供預加載時網絡資源自動調度能力,以減少預加載的網絡請求對正在播放視頻的網絡請求的影響。自動調度的策略是:僅當正在播放的視頻緩沖到達一定閾值后,才會允許預加載進行請求。若您需要自行控制預加載的實時請求,可以通過以下方法將此策略關閉:
AliPlayerGlobalSettings.enableNetworkBalance(false);
開啟本地緩存功能,詳細操作請參見本地緩存。
獲取AliMediaLoader實例。
AliMediaLoader實例為單例,即無論獲取多少次,創建的都是同一個實例。
MediaLoader mediaLoader = MediaLoader.getInstance();
配置AliMediaLoader。
配置回調,并開始加載。
說明若
player
的prepare
時刻與mediaLoader.load
的調用時刻一致,由于都需要遍歷本地文件,則可能導致出現ANR的問題。建議設置為當player
在onPrepared
回調中時,才開始加載。/** * 設置加載狀態回調 */ mediaLoader.setOnLoadStatusListener(new MediaLoader.OnLoadStatusListener() { @Override public void onErrorV2(String url, ErrorInfo errorInfo) { //加載出錯 } @Override public void onCompleted(String s) { //加載完成 } @Override public void onCanceled(String s) { //加載取消 } }); /** * 開始加載文件。異步加載。可以同時加載多個視頻文件。 * @param url - 視頻文件地址。 * @param duration - 加載的時長大小,單位:毫秒。 */ mediaLoader.load("url","duration");
可選:刪除加載文件。
可按需刪除加載文件,以節省空間。Android播放器SDK不提供刪除接口,需要在App刪除加載目錄下的文件。
動態預加載
動態預加載策略,支持集成方既可以控制當前正在播放視頻的緩存,又可以控制預加載的個數和緩存,滿足業務方對播放體驗與成本開銷之間取得平衡的訴求。
多碼率HLS視頻預加載
在listPlayer
+多碼率HLS視頻播放場景下,支持集成方預加載與當前播放清晰度一致的流,并且可以根據業務情況選擇預加載模式。
/**
* 默認配置,播放和預加載默認碼率
*/
/****
* default mode, play and preload default bitrate of a stream
*/
MultiBitratesMode_Default(0),
/**
* 首幀優先配置,起播視頻默認播放已完成預加載的碼率
*/
/****
* First frame cost (FC) priority, decrease first frame cost. only play bitrate of the hls stream which has been preloaded.
*/
MultiBitratesMode_FCPrio(1),
/**
* 兼顧首幀和播放平滑,切換前后(moveToNext)的視頻碼率一致,且兼顧首幀性能
*/
/****
* First frame and play smooth, play the same bitrate before and after moveToNext
*/
MultiBitratesMode_FC_AND_SMOOTH(2),
/**
* 播放平滑優先配置,起播視頻默認播放前一個視頻的碼率
*/
/****
* Play Smooth priority, play the same bitrate before and after moveToNext.
*/
MultiBitratesMode_SmoothPrio(3);
//選擇多碼率加載模式
mVideoListPlayer.SetMultiBitratesMode(preLoadMode);
//(可選)選擇起播碼率
mVideoListPlayer.setDefaultBandWidth(defaultBandWidth)
//(可選)在onPrepared回調中,選擇abr模式
mVideoListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
//abr only effect on multiBitrate m3u8
mVideoListPlayer.selectTrack(-1);
}
});
獲取下載速度
獲取當前播放視頻的下載速度,在onInfo回調中獲取,由getExtraValue
接口實現。示例如下:
mAliPlayer.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網絡精準調度、實時解析生效,有效提高網絡性能。
播放器SDK從6.7.0版本開始支持增強型HTTPDNS。6.7.0~6.11.0版本播放器SDK,請先提交工單或聯系阿里云商務經理申請開通;6.12.0及以后版本無需申請,默認開啟。
增強型HTTPDNS使用示例
增強型HTTPDNS僅為阿里云CDN域名提供HTTPDNS服務,請確保您配置的域名為阿里云CDN域名且已完成域名配置可正常使用。視頻點播中添加和配置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");
視頻下載
Android播放器SDK提供了點播服務視頻的下載功能,允許用戶通過阿里云播放器將視頻緩存至本地觀看。同時,提供了普通下載和安全下載兩種下載方式。
普通下載
下載后的視頻數據未經過阿里云加密,用戶可以用第三方播放器播放。
安全下載
下載后的視頻數據經過阿里云加密。第三方播放器無法播放。僅支持使用阿里云的播放器進行播放。
使用說明
僅VidSts和VidAuth方式支持視頻下載功能。
使用播放器的視頻下載功能,需要在點播控制臺開啟并配置下載模式,詳細操作請參見離線下載。
視頻下載支持斷點續傳。
操作步驟
可選:配置安全下載的加密校驗文件。僅安全下載需要配置,普通下載無需配置。
說明請確保配置的加密校驗文件與App信息一致,否則會導致視頻下載失敗。
如果設置為安全下載方式,則需要將在點播控制臺生成的密鑰文件配置到播放器SDK中,用于視頻下載和播放的解密驗證,密鑰文件的生成請參見開啟安全下載。
建議在Application中配置一次即可,示例如下:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat所在的文件路徑"); //建議將encryptedApp.dat加密校驗文件存放到手機中后,此處設置加密校驗文件的手機本地文件路徑
創建并設置下載器。
創建下載器,通過AliDownloaderFactory創建。示例如下:
AliMediaDownloader mAliDownloader = null; ...... //創建下載器 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); //配置下載保存的路徑 mAliDownloader.setSaveDir("保存的文件夾地址");
設置監聽事件。
下載器提供了多個事件監聽。示例如下:
mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() { @Override public void onPrepared(MediaInfo mediaInfo) { //準備下載項成功 } }); mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() { @Override public void onDownloadingProgress(int percent) { //下載進度百分比 } @Override public void onProcessingProgress(int percent) { //處理進度百分比 } }); mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { //下載出錯 } }); mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() { @Override public void onCompletion() { //下載成功 } });
準備下載源。
通過
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。 //準備下載源 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。 //準備下載源 mAliDownloader.prepare(vidAuth);
說明源文件格式與輸出的下載文件格式保持一致,不支持更改。
準備成功后,選擇下載項并開始下載。
準備成功后,會回調
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端低延時直播功能,詳情請參見阿里云播放器SDK集成Native RTS SDK實現說明(Android端)。
異常處理
使用阿里云播放器播放視頻發生異常時,可借助單點探查功能快速定位問題,詳細內容,請參見單點追查。