進(jìn)階功能
本文介紹Android播放器SDK進(jìn)階功能的使用示例,更多功能的支持和使用請(qǐng)參見(jiàn)API說(shuō)明。
播放
列表播放
針對(duì)典型的列表播放場(chǎng)景,Android播放器SDK提供了完善的列表播放功能,結(jié)合預(yù)加載等機(jī)制大幅改善短視頻的起播速度。
操作步驟
如果您想要擁有更好的列表播放操作體驗(yàn),推薦使用我們的微短劇解決方案,詳細(xì)內(nèi)容請(qǐng)查看微短劇AUIKit。
播放帶透明度視頻
功能簡(jiǎn)介
阿里云播放器SDK支持渲染Alpha通道,實(shí)現(xiàn)播放透明禮物的動(dòng)態(tài)效果。在直播間等場(chǎng)景中,播放透明禮物動(dòng)效且不會(huì)遮擋直播間內(nèi)容,明顯提升用戶觀看和互動(dòng)體驗(yàn)。
使用限制
一體化SDK6.8.0及以后版本或播放器SDK6.9.0及以后版本支持透明渲染能力。
功能優(yōu)勢(shì)
使用帶有透明度信息的MP4視頻作為禮物特效可以提供更好的動(dòng)效質(zhì)量,較小的文件體積,更高的兼容性和更高的開(kāi)發(fā)效率。這使得禮物特效能夠更好地展示給用戶,提升用戶體驗(yàn)。
更好的動(dòng)效質(zhì)量:MP4視頻可以保留原始的動(dòng)效質(zhì)量,包括細(xì)節(jié)和顏色等,相比于其他格式,如 APN 或IXD,MP4可以更準(zhǔn)確地還原設(shè)計(jì)師創(chuàng)作的動(dòng)效效果。
較小的文件體積:MP4視頻文件相比于其他格式,如APNG或IXD,可以更有效地壓縮文件體積,提升加載速度并降低網(wǎng)絡(luò)帶寬消耗。
更高的兼容性:MP4視頻是一種通用的視頻格式,在各種設(shè)備和瀏覽器中都得到廣泛支持,支持在主流設(shè)備上播放和觀看禮物特效。
更高的開(kāi)發(fā)效率:使用MP4視頻作為禮物特效的技術(shù)方案相對(duì)簡(jiǎn)單,不需要開(kāi)發(fā)人員去研究和實(shí)現(xiàn)復(fù)雜的解析和渲染邏輯,開(kāi)發(fā)人員可以專注于其他功能的實(shí)現(xiàn),提高開(kāi)發(fā)效率。
示例代碼
新增如下接口:設(shè)置alpha模式(alpha通道在視頻素材的方位:上、下、左、右),默認(rèn)值是None。
素材的alpha通道的位置要與setAlphaRenderMode參數(shù)設(shè)置的一致。
playerview的大小要與素材的分辨率成比例。
/**
* 設(shè)置Alpha渲染模式
*
* @param alphaRenderMode 鏡像模式。見(jiàn){@link AlphaRenderMode}。
*/
/****
* Set a alpha render mode
*
* @param alphaRenderMode The specified alpha render mode. See {@link AlphaRenderMode}.
*/
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------View用法-------------
// 對(duì)于View需要設(shè)置透明
//TextureView
TextureView aliplayerView; //用于播放的 view
aliplayerView.setOpaque(false);
//SurfaceView
SurfaceView aliplayerView; //用于播放的 view
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); //把SurfaceView置于顯示窗口的最頂層
//-----------AliPlayer用法-----------
//設(shè)置alpha模式
aliplayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
//設(shè)置alpha模式對(duì)應(yīng)的素材
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() {
//可選:?jiǎn)螌?shí)例播放完成后如果有銜接問(wèn)題,可以清屏
aliplayer.clearScreen();
}
}
aliplayer.setAutoPlay(true);
aliplayer.prepare();
外掛字幕
Android播放器SDK支持添加和切換外掛字幕,現(xiàn)已支持SRT、SSA、ASS、VTT這4種格式的字幕。示例如下:
創(chuàng)建顯示字幕的View。
根據(jù)不同的字幕格式創(chuàng)建不同的View。
//用于顯示SRT和VTT字幕 SubtitleView subtitleView = new SubtitleView(getContext()); //用于顯示ASS和SSA字幕 AssSubtitleView assSubtitleView = new AssSubtitleView(getContext()); //將字幕View添加到布局視圖中 viewGroup.addView(assSubtitleView);
設(shè)置字幕相關(guān)監(jiān)聽(tīng)。
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
回調(diào)后,可通過(guò)如下方法進(jìn)行顯示或隱藏字幕://trackIndex:傳入字幕索引;true:表示顯示傳入的字幕;false:表示隱藏傳入的字幕 mAliPlayer.selectExtSubtitle(trackIndex, true);
純音頻播放
通過(guò)禁用視頻播放,達(dá)到純音頻播放的效果。在prepare之前配置PlayerConfig。
PlayerConfig config = mAliPlayer.getConfig();
config.mDisableVideo = true; //設(shè)置開(kāi)啟純音頻播放
mAliPlayer.setConfig(config);
軟硬解切換
解碼方式需要在播放前切換,播放中切換解碼方式將不會(huì)生效。
Android播放器SDK提供了H.264、H.265的硬解碼能力,同時(shí)提供了enableHardwareDecoder
提供開(kāi)關(guān)。默認(rèn)開(kāi),并且在硬解初始化失敗時(shí),自動(dòng)切換為軟解,保證視頻的正常播放。示例如下:
//開(kāi)啟硬解。默認(rèn)開(kāi)啟
mAliyunVodPlayer.enableHardwareDecoder(true);
如果從硬解自動(dòng)切換為軟解,將會(huì)通過(guò)onInfo
回調(diào),示例如下:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
//切換到軟解
}
}
});
H265自適應(yīng)播放
當(dāng)播放H265流硬解失敗且已設(shè)置H264備流時(shí),實(shí)現(xiàn)自動(dòng)降級(jí)播放H264備流;若未設(shè)置H264備流,則自動(dòng)降級(jí)為H265軟解播放。
該功能只有在開(kāi)通端云結(jié)合自適應(yīng)解碼增值服務(wù)后才會(huì)開(kāi)啟。您需要提交宜搭表單申請(qǐng)License授權(quán)。
端云結(jié)合自適應(yīng)解碼增值服務(wù)主要包含:1、云端硬解兼容性數(shù)據(jù)動(dòng)態(tài)下發(fā);2、H265流自適應(yīng)降級(jí)H264流。
SDK依然具備硬解失敗自動(dòng)轉(zhuǎn)換為軟解的功能,即便未開(kāi)啟增值服務(wù)。
設(shè)置備流示例如下:
// 應(yīng)用層維護(hù)一個(gè)Map,存儲(chǔ)所有原URL-備URL的鍵值對(duì),切換時(shí)根據(jù)原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 "";
}
}
});
網(wǎng)絡(luò)自適應(yīng)切換視頻清晰度
HLS的多碼率自適應(yīng)視頻流可以在視頻點(diǎn)播中經(jīng)過(guò)視頻打包轉(zhuǎn)碼模板組進(jìn)行轉(zhuǎn)碼處理后生成,詳細(xì)操作請(qǐng)參見(jiàn)點(diǎn)播多碼率自適應(yīng)配置。
經(jīng)過(guò)視頻點(diǎn)播轉(zhuǎn)碼生成的自適應(yīng)流,如果使用Vid方式播放,則需要指定默認(rèn)播放清晰度列表為
DEFINITION_AUTO
,才會(huì)獲取并播放自適應(yīng)的視頻流;否則將按照默認(rèn)邏輯選擇低清晰度的視頻流進(jìn)行播放,默認(rèn)清晰播放順序請(qǐng)參見(jiàn)清晰度相關(guān)問(wèn)題。以VidAuth播放方式為例,指定清晰度列表的示例如下:VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
Android播放器SDK支持多碼率自適應(yīng)HLS、DASH視頻流。在prepare
成功之后,通過(guò)getMediaInfo
可以獲取到各個(gè)碼流的信息,即TrackInfo
。示例如下:
List<TrackInfo> trackInfos = aliyunVodPlayer.getMediaInfo().getTrackInfos();
在播放過(guò)程中,可以通過(guò)調(diào)用播放器的selectTrack
方法切換播放的碼流,取值為AUTO_SELECT_INDEX時(shí),為多碼率自適應(yīng)。示例如下:
int index = trackInfo.getIndex();
//多碼率切換
aliyunVodPlayer.selectTrack(index);
//多碼率切換并自適應(yīng)
aliyunVodPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
切換的結(jié)果會(huì)在OnTrackChangedListener
監(jiān)聽(tīng)之后會(huì)回調(diào)(在調(diào)用selectTrack
之前設(shè)置)。示例如下:
aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) {
//切換成功
}
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
//切換失敗。失敗原因通過(guò)errorInfo.getMsg()獲取
}
});
可選:在調(diào)用播放器selectTrack
方法切換播放碼流為多碼率自適應(yīng)前,可以通過(guò)config設(shè)置自適應(yīng)碼率(ABR)切換的清晰度上限,以避免自動(dòng)切換到預(yù)期之外的碼率。示例如下:(建議在播放器調(diào)用prepare
方法,或者列表播放器調(diào)用moveTo
方法前調(diào)用下述代碼,使其生效。)
PlayerConfig config = mAliyunVodPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; //設(shè)置abr清晰度上限對(duì)應(yīng)的像素?cái)?shù)量為921600(長(zhǎng) * 寬 = 1280 * 720),使得abr允許切換的清晰度對(duì)應(yīng)的像素?cái)?shù)量 <= 該值
mAliyunVodPlayer.setConfig(config);
截圖
Android播放器SDK提供了對(duì)當(dāng)前視頻截圖的功能,由snapshot
接口實(shí)現(xiàn)。截取的是原始的數(shù)據(jù),并轉(zhuǎn)為bitmap
返回。回調(diào)接口為OnSnapShotListener
。示例如下:
//設(shè)置截圖回調(diào)
aliyunVodPlayer.setOnSnapShotListener(new OnSnapShotListener(){
@Override
public void onSnapShot(Bitmap bm, int with, int height){
//獲取到的bitmap以及圖片的寬高。
}
});
//截取當(dāng)前播放的畫面
aliyunVodPlayer.snapshot();
試看
Android播放器SDK通過(guò)配合點(diǎn)播服務(wù)配置,可以實(shí)現(xiàn)試看功能,支持VidSts和VidAuth(視頻點(diǎn)播推薦使用此方式)兩種播放方式。如何配置和使用試看功能,請(qǐng)參見(jiàn)試看視頻。
配置試看功能之后,通過(guò)VidPlayerConfigGen.setPreviewTime()
方法設(shè)置播放器的試看時(shí)長(zhǎng)。以VidSts播放方式為例,示例如下:
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);//20秒試看
vidSts.setPlayConfig(configGen);//設(shè)置給播放源
...
當(dāng)設(shè)置試看的時(shí)長(zhǎng),通過(guò)Android播放器SDK播放視頻時(shí),服務(wù)端將不會(huì)返回完整的視頻內(nèi)容,而是返回試看時(shí)間段的內(nèi)容。
VidPlayerConfigGen支持設(shè)置服務(wù)端支持的請(qǐng)求參數(shù)。請(qǐng)參見(jiàn)請(qǐng)求參數(shù)說(shuō)明。
FLV和MP3格式視頻暫時(shí)不支持試看。
設(shè)置黑名單
Android播放器SDK提供了硬解的黑名單機(jī)制。對(duì)于明確不能使用硬解播放的機(jī)器,可以直接使用軟解,避免了無(wú)效的操作。示例如下:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
退出App之后,黑名單自動(dòng)失效。
設(shè)置Referer
Android播放器SDK支持設(shè)置Referer,配合控制臺(tái)的黑白名單Referer,可以控制訪問(wèn)權(quán)限,由PlayerConfig
方法設(shè)置請(qǐng)求Referer。播放器SDK的設(shè)置示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//設(shè)置referer,示例:http://example.aliyundoc.com。(注意:設(shè)置referer時(shí),需要加上前面的協(xié)議部分。)
config.mReferrer = referrer;
....//其他設(shè)置
//設(shè)置配置給播放器
mAliyunVodPlayer.setConfig(config);
設(shè)置UserAgent
Android播放器SDK提供了PlayerConfig
用來(lái)設(shè)置請(qǐng)求UA。設(shè)置之后,播放器請(qǐng)求的過(guò)程中將會(huì)帶上UA信息。示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//設(shè)置UA
config.mUserAgent = "需要設(shè)置的UserAgent";
....//其他設(shè)置
//設(shè)置配置給播放器
mAliyunVodPlayer.setConfig(config);
配置網(wǎng)絡(luò)重試時(shí)間和次數(shù)
支持設(shè)置Android播放器SDK的網(wǎng)絡(luò)超時(shí)的時(shí)間和重試次數(shù),由PlayerConfig
方法實(shí)現(xiàn)。示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間,單位:毫秒
config.mNetworkTimeout = 5000;
//設(shè)置超時(shí)重試次數(shù)。每次重試間隔為networkTimeout。networkRetryCount=0則表示不重試,重試策略app決定,默認(rèn)值為2
config.mNetworkRetryCount=2;
....//其他設(shè)置
//設(shè)置配置給播放器
mAliyunVodPlayer.setConfig(config);
如果設(shè)置了NetworkRetryCount,若此時(shí)發(fā)生網(wǎng)絡(luò)問(wèn)題,導(dǎo)致出現(xiàn)loading后,那么將會(huì)重試NetworkRetryCount次,每次的間隔時(shí)間為mNetworkTimeout。
如果重試多次之后,還是loading的狀態(tài),那么就會(huì)回調(diào)
onError
事件,此時(shí),ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT。如果NetworkRetryCount設(shè)置為0,當(dāng)網(wǎng)絡(luò)重試超時(shí)的時(shí)候,播放器就會(huì)回調(diào)
onInfo
事件,事件的InfoBean.getCode()=InfoCode.NetworkRetry。 此時(shí),可以調(diào)用播放器的reload
方法進(jìn)行重新加載網(wǎng)絡(luò),或者進(jìn)行其他的處理。
配置緩存和延遲控制
Android播放器SDK通過(guò)PlayerConfig
提供了設(shè)置緩存和延遲的控制接口。示例如下:
設(shè)置HTTP Header
通過(guò)PlayerConfig
方法,可以給播放器中的請(qǐng)求加上HTTP的header參數(shù)。示例如下:
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//定義header
String[] headers = new String[1];
headers[0]="Host:example.com";//比如需要設(shè)置Host到header中。
//設(shè)置header
config.setCustomHeaders(headers);
....//其他設(shè)置
//設(shè)置配置給播放器
mAliyunVodPlayer.setConfig(config);
直播RTS降級(jí)
RTS自動(dòng)降級(jí)
在使用超低延時(shí)直播RTS地址播放的場(chǎng)景下,當(dāng)不設(shè)置RTS降級(jí)地址且RTS拉流失敗時(shí),會(huì)自動(dòng)降級(jí)到RTS對(duì)應(yīng)的默認(rèn)flv地址進(jìn)行播放。示例如下:
// 1表示開(kāi)啟,0表示關(guān)閉。默認(rèn)開(kāi)啟
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);
RTS自定義降級(jí)
在使用超低延時(shí)直播RTS地址播放的場(chǎng)景下,通過(guò)設(shè)置RTS的降級(jí)地址(如HLS地址或FLV地址),當(dāng)RTS拉流失敗時(shí),會(huì)自動(dòng)降級(jí)到該地址播放。示例如下:
PlayerConfig config = player.getConfig();
//可選,配置config其他項(xiàng)
UrlSource urlSource = new UrlSource();
urlSource.setUri(downgradeUrl);
//設(shè)置降級(jí)URL
player.enableDowngrade(urlSource, config);
切換左右聲道
Android播放器SDK通過(guò)player.setOutputAudioChannel
方法設(shè)置輸出聲道,如果輸入源是雙聲道,則支持通過(guò)下述方法切換為左聲道或右聲道;如果輸入源是單聲道,則設(shè)置無(wú)效。
下述輸出聲道的設(shè)置會(huì)同時(shí)影響音頻渲染及PCM數(shù)據(jù)回調(diào)。
/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT 切換到左聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT 切換到右聲道播放,
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE 不切換聲道,保持輸入源聲道播放
*/
player.setOutputAudioChannel();
解析音頻流
設(shè)置監(jiān)聽(tīng),可獲取音視頻流數(shù)據(jù)。音視頻不能是加密流,加密流無(wú)法解析。
//可選配置1:是否返回底層數(shù)據(jù)的地址
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true;//是否只返回底層視頻數(shù)據(jù)地址
config.mAudioDataAddr = true;//是否只返回底層音頻數(shù)據(jù)地址
player.setRenderFrameCallbackConfig(config);
//可選配置2:硬解時(shí),RenderFrame返回 texture_oes_id,軟解時(shí),RenderFrame返回源數(shù)據(jù)
player.enableHardwareDecoder(true);
//設(shè)置監(jiān)聽(tīng),獲取音視頻數(shù)據(jù)
player.setOnRenderFrameCallback(frameInfo -> {
if (frameInfo.frameType == FrameInfo.FrameType_video) {
//視頻數(shù)據(jù)
} else {
//音頻數(shù)據(jù)
}
return false;
});
設(shè)置視頻背景色
Android播放器SDK支持設(shè)置播放器渲染的背景色。接口和用法說(shuō)明如下:
接口示例
/**
* 設(shè)置視頻的背景色
*
* @param color ARGB
*
*/
/****
* Set video background color
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);
用法說(shuō)明
//參數(shù)為8位16進(jìn)制數(shù)據(jù),8位數(shù)據(jù)兩兩為一組,按照順序分別表示A(alpha 透明度) R(red) G(green) B(blue)
//例如0x0000ff00,表示綠色
player.setVideoBackgroundColor(0x0000ff00);
vidAuth設(shè)置指定播放域名
通過(guò)vidAuth方式可以指定vid對(duì)應(yīng)的域名等字段,支持的字段詳情請(qǐng)參見(jiàn)GetPlayInfo請(qǐng)求參數(shù)。接口及用法說(shuō)明如下:
接口示例
/**
* 設(shè)置播放參數(shù)
*
* @param playConfig 播放參數(shù)
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);
用法說(shuō)明
通過(guò)其中的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);
性能
預(yù)渲染
Android播放器SDK支持在起播之前快速渲染第一幀。示例如下:
player.setOption(ALLOW_PRE_RENDER, 1);
本地緩存
Android播放器SDK提供了本地緩存的功能,能夠讓用戶重復(fù)播放視頻時(shí),提高起播速度、提高seek速度、減少卡頓,也能達(dá)到節(jié)省流量的目的。
開(kāi)啟本地緩存
本地緩存功能默認(rèn)關(guān)閉,如需使用,需要手動(dòng)開(kāi)啟。通過(guò)AliPlayerGlobalSettings
中的enableLocalCache
控制。示例如下:
/**
* 開(kāi)啟本地緩存,開(kāi)啟之后,會(huì)緩存到本地文件中。
*
* @param enable - 本地緩存功能開(kāi)關(guān)。true:開(kāi)啟本地緩存,false:關(guān)閉,默認(rèn)關(guān)閉。
* @param maxBufferMemoryKB - 5.4.7.1及以后版本已廢棄,暫無(wú)作用
* @param localCacheDir - 本地緩存的文件目錄,為絕對(duì)路徑。
*/
public static void enableLocalCache(boolean enable,
int maxBufferMemoryKB,
java.lang.String localCacheDir)
/**
* 本地緩存文件清理相關(guān)配置。
*
* @param expireMin - 5.4.7.1及以后版本已廢棄,暫無(wú)作用。
* @param maxCapacityMB - 最大緩存容量。單位:兆,默認(rèn)值20GB,在清理時(shí),如果緩存總?cè)萘砍^(guò)此大小,則會(huì)以cacheItem為粒度,按緩存的最后時(shí)間排序,一個(gè)一個(gè)的刪除最舊的緩存文件,直到小于等于最大緩存容量。
* @param freeStorageMB - 磁盤最小空余容量。單位:兆,默認(rèn)值0,在清理時(shí),同最大緩存容量,如果當(dāng)前磁盤容量小于該值,也會(huì)按規(guī)則一個(gè)一個(gè)的刪除緩存文件,直到freeStorage大于等于該值或者所有緩存都被清理掉。
*/
public static void setCacheFileClearConfig(long expireMin,
long maxCapacityMB,
long freeStorageMB)
/**
* 設(shè)置加載url的hash值回調(diào)。如果不設(shè)置,SDK使用md5算法。
*/
public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
如果視頻播放URL帶有鑒權(quán)參數(shù),本地緩存和播放時(shí)鑒權(quán)參數(shù)會(huì)變化,為提高相同URL在不同鑒權(quán)下的緩存命中率,可以將URL的鑒權(quán)參數(shù)去掉后再通過(guò)
setCacheUrlHashCallback
接口計(jì)算Hash值(例如MD5)。例如:帶有鑒權(quán)參數(shù)的視頻播放URL為http://****.mp4?aaa
,則加載時(shí)使用http://****.mp4
計(jì)算Hash值。但如果視頻為經(jīng)過(guò)加密后的m3u8視頻,其keyURL若按照去掉鑒權(quán)參數(shù)再計(jì)算Hash值的方式處理,會(huì)導(dǎo)致不同視頻的緩存命中同一個(gè)key導(dǎo)致播放失敗。解決方案:您可以在setCacheUrlHashCallback
的回調(diào)里進(jìn)行域名判斷,僅對(duì)播放域名(http(s)://xxxxx.m3u8?aaaa
)做去掉鑒權(quán)參數(shù)的處理,而keyURL對(duì)應(yīng)的域名(http(s)://yyyyy?bbbb
)不做去掉鑒權(quán)參數(shù)的處理。如果服務(wù)器同時(shí)支持HTTP和HTTPS協(xié)議,但是不同的協(xié)議指向的媒體文件是同一個(gè),則可以將請(qǐng)求頭去掉或者統(tǒng)一后再計(jì)算Hash值。例如:
視頻播放URL為
https://****.mp4
和http://****.mp4
,則加載時(shí)使用****.mp4
計(jì)算hash值。視頻播放URL為
https://****.mp4
,加載時(shí)統(tǒng)一為http://****.mp4
后再計(jì)算Hash值。
針對(duì)5.5.4.0及以后版本的播放器SDK,如果視頻播放URL帶有鑒權(quán)參數(shù)且播放協(xié)議為HLS,可以通過(guò)設(shè)置
PlayerConfig.mEnableStrictAuthMode
字段,進(jìn)行不同鑒權(quán)模式的選擇(默認(rèn)值為false):非嚴(yán)格鑒權(quán)(false):鑒權(quán)也緩存,若上一次只緩存了部分媒體,下次播放至非緩存部分時(shí),播放器會(huì)用緩存的鑒權(quán)發(fā)起請(qǐng)求,如果URL鑒權(quán)設(shè)置的有效期很短,會(huì)導(dǎo)致播放異常。
嚴(yán)格鑒權(quán)(true):鑒權(quán)不緩存,每次起播都進(jìn)行鑒權(quán),無(wú)網(wǎng)絡(luò)下會(huì)導(dǎo)致起播失敗。
開(kāi)啟或關(guān)閉單個(gè)URL的本地緩存
如果想要針對(duì)單個(gè)URL開(kāi)啟或關(guān)閉本地緩存功能,可以在player config
中設(shè)置。
//先獲取配置
PlayerConfig config = mAliyunVodPlayer.getConfig();
//是否針對(duì)播放的URL開(kāi)啟本地緩存,默認(rèn)值為true。當(dāng)AliPlayerGlobalSettings處的本地緩開(kāi)啟時(shí),且同時(shí)開(kāi)啟此處的本地緩存,即設(shè)置為true,該URL的本地緩存才會(huì)生效;若此處設(shè)置為false,則關(guān)閉該URL的本地緩存。
config.mEnableLocalCache = false;
....//其他設(shè)置
//設(shè)置配置給播放器
mAliyunVodPlayer.setConfig(config);
使用默認(rèn)緩存路徑
如果想要使用默認(rèn)路徑進(jìn)行緩存,可以通過(guò)AliPlayerGlobalSettings
進(jìn)行如下設(shè)置。
/**
* 開(kāi)啟本地緩存,開(kāi)啟之后,就會(huì)緩存到本地文件中。
* @param enable true:開(kāi)啟本地緩存。false:關(guān)閉。默認(rèn)關(guān)閉。
*/
/****
* 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)
大緩存
通過(guò)設(shè)置數(shù)據(jù)的最大緩沖區(qū)時(shí)長(zhǎng)可以在播放視頻時(shí)通過(guò)緩存視頻數(shù)據(jù)到內(nèi)存中,從而提高播放性能和觀看體驗(yàn)。當(dāng)最大緩沖區(qū)時(shí)長(zhǎng)設(shè)置過(guò)大時(shí),會(huì)造成緩沖區(qū)對(duì)內(nèi)存的消耗。通過(guò)啟用大緩存,可以將視頻數(shù)據(jù)緩存到文件中,從而降低內(nèi)存的占用,進(jìn)一步提高播放器性能。
當(dāng)mMaxBufferDuration設(shè)置超過(guò)50000 ms時(shí),通過(guò)開(kāi)啟本地緩存觸發(fā)大緩存功能自動(dòng)啟用。操作流程如下:
預(yù)加載
Android播放器SDK提供預(yù)加載功能,是對(duì)本地緩存功能的升級(jí),通過(guò)設(shè)置視頻緩存的內(nèi)存占用大小,更能提升視頻的起播速度。
預(yù)加載功能的使用限制如下:
目前支持MP4、MP3、FLV、HLS等單個(gè)媒體文件的加載。
僅支持UrlSource播放方式播放視頻的預(yù)加載,暫不支持VidAuth、VidSts方式播放視頻的預(yù)加載。
Android播放器SDK默認(rèn)提供預(yù)加載時(shí)網(wǎng)絡(luò)資源自動(dòng)調(diào)度能力,以減少預(yù)加載的網(wǎng)絡(luò)請(qǐng)求對(duì)正在播放視頻的網(wǎng)絡(luò)請(qǐng)求的影響。自動(dòng)調(diào)度的策略是:僅當(dāng)正在播放的視頻緩沖到達(dá)一定閾值后,才會(huì)允許預(yù)加載進(jìn)行請(qǐng)求。若您需要自行控制預(yù)加載的實(shí)時(shí)請(qǐng)求,可以通過(guò)以下方法將此策略關(guān)閉:
AliPlayerGlobalSettings.enableNetworkBalance(false);
開(kāi)啟本地緩存功能,詳細(xì)操作請(qǐng)參見(jiàn)本地緩存。
獲取AliMediaLoader實(shí)例。
AliMediaLoader實(shí)例為單例,即無(wú)論獲取多少次,創(chuàng)建的都是同一個(gè)實(shí)例。
MediaLoader mediaLoader = MediaLoader.getInstance();
配置AliMediaLoader。
配置回調(diào),并開(kāi)始加載。
說(shuō)明若
player
的prepare
時(shí)刻與mediaLoader.load
的調(diào)用時(shí)刻一致,由于都需要遍歷本地文件,則可能導(dǎo)致出現(xiàn)ANR的問(wèn)題。建議設(shè)置為當(dāng)player
在onPrepared
回調(diào)中時(shí),才開(kāi)始加載。/** * 設(shè)置加載狀態(tài)回調(diào) */ mediaLoader.setOnLoadStatusListener(new MediaLoader.OnLoadStatusListener() { @Override public void onErrorV2(String url, ErrorInfo errorInfo) { //加載出錯(cuò) } @Override public void onCompleted(String s) { //加載完成 } @Override public void onCanceled(String s) { //加載取消 } }); /** * 開(kāi)始加載文件。異步加載。可以同時(shí)加載多個(gè)視頻文件。 * @param url - 視頻文件地址。 * @param duration - 加載的時(shí)長(zhǎng)大小,單位:毫秒。 */ mediaLoader.load("url","duration");
可選:刪除加載文件。
可按需刪除加載文件,以節(jié)省空間。Android播放器SDK不提供刪除接口,需要在App刪除加載目錄下的文件。
動(dòng)態(tài)預(yù)加載
動(dòng)態(tài)預(yù)加載策略,支持集成方既可以控制當(dāng)前正在播放視頻的緩存,又可以控制預(yù)加載的個(gè)數(shù)和緩存,滿足業(yè)務(wù)方對(duì)播放體驗(yàn)與成本開(kāi)銷之間取得平衡的訴求。
多碼率HLS視頻預(yù)加載
在listPlayer
+多碼率HLS視頻播放場(chǎng)景下,支持集成方預(yù)加載與當(dāng)前播放清晰度一致的流,并且可以根據(jù)業(yè)務(wù)情況選擇預(yù)加載模式。
/**
* 默認(rèn)配置,播放和預(yù)加載默認(rèn)碼率
*/
/****
* default mode, play and preload default bitrate of a stream
*/
MultiBitratesMode_Default(0),
/**
* 首幀優(yōu)先配置,起播視頻默認(rèn)播放已完成預(yù)加載的碼率
*/
/****
* 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),
/**
* 播放平滑優(yōu)先配置,起播視頻默認(rèn)播放前一個(gè)視頻的碼率
*/
/****
* Play Smooth priority, play the same bitrate before and after moveToNext.
*/
MultiBitratesMode_SmoothPrio(3);
//選擇多碼率加載模式
mVideoListPlayer.SetMultiBitratesMode(preLoadMode);
//(可選)選擇起播碼率
mVideoListPlayer.setDefaultBandWidth(defaultBandWidth)
//(可選)在onPrepared回調(diào)中,選擇abr模式
mVideoListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
//abr only effect on multiBitrate m3u8
mVideoListPlayer.selectTrack(-1);
}
});
獲取下載速度
獲取當(dāng)前播放視頻的下載速度,在onInfo回調(diào)中獲取,由getExtraValue
接口實(shí)現(xiàn)。示例如下:
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
//當(dāng)前下載速度
long extraValue = infoBean.getExtraValue();
}
}
});
網(wǎng)絡(luò)特性
HTTPDNS
HTTPDNS是通過(guò)DNS解析技術(shù)將域名解析請(qǐng)求發(fā)送到特定的HTTPDNS服務(wù)器,以獲取更快、更穩(wěn)定的域名解析結(jié)果,降低DNS劫持風(fēng)險(xiǎn)。
阿里云播放器SDK提供增強(qiáng)型HTTPDNS功能,專為阿里云CDN域名提供HTTPDNS服務(wù),支持阿里云CDN網(wǎng)絡(luò)精準(zhǔn)調(diào)度、實(shí)時(shí)解析生效,有效提高網(wǎng)絡(luò)性能。
播放器SDK從6.7.0版本開(kāi)始支持增強(qiáng)型HTTPDNS。6.7.0~6.11.0版本播放器SDK,請(qǐng)先提交工單或聯(lián)系阿里云商務(wù)經(jīng)理申請(qǐng)開(kāi)通;6.12.0及以后版本無(wú)需申請(qǐng),默認(rèn)開(kāi)啟。
增強(qiáng)型HTTPDNS使用示例
增強(qiáng)型HTTPDNS僅為阿里云CDN域名提供HTTPDNS服務(wù),請(qǐng)確保您配置的域名為阿里云CDN域名且已完成域名配置可正常使用。視頻點(diǎn)播中添加和配置CDN域名請(qǐng)參見(jiàn)添加加速域名。更多有關(guān)CDN域名的信息請(qǐng)參見(jiàn)阿里云CDN。
//打開(kāi)增強(qiáng)型httpdns
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
//可選,增加httpdns預(yù)解析域名
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");
HTTP/2
Android播放器SDK自5.5.0.0版本開(kāi)始默認(rèn)開(kāi)啟使用HTTP/2。
Android播放器SDK支持使用HTTP/2協(xié)議,該協(xié)議通過(guò)多路復(fù)用,避免隊(duì)頭阻塞,以改善播放性能。示例如下:
AliPlayerGlobalSettings.setUseHttp2(true);
HTTP預(yù)建連TCP
針對(duì)HTTP的視頻播放請(qǐng)求(非HTTPS),通過(guò)提前建立TCP連接能夠顯著改善用戶體驗(yàn),降低網(wǎng)絡(luò)連接耗時(shí),確保播放的即時(shí)性與連續(xù)性,同時(shí)優(yōu)化網(wǎng)絡(luò)和系統(tǒng)資源的使用效率。使用方式如下:
// domain格式為host[:port],port可選,用分號(hào)(;)隔開(kāi)多個(gè)域名
// 全局設(shè)置
// 全量接口每次設(shè)置后使用當(dāng)前的字符串為準(zhǔn)(多-新增,少-刪除),字符串空為停止預(yù)建連
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");
視頻下載
Android播放器SDK提供了點(diǎn)播服務(wù)視頻的下載功能,允許用戶通過(guò)阿里云播放器將視頻緩存至本地觀看。同時(shí),提供了普通下載和安全下載兩種下載方式。
普通下載
下載后的視頻數(shù)據(jù)未經(jīng)過(guò)阿里云加密,用戶可以用第三方播放器播放。
安全下載
下載后的視頻數(shù)據(jù)經(jīng)過(guò)阿里云加密。第三方播放器無(wú)法播放。僅支持使用阿里云的播放器進(jìn)行播放。
使用說(shuō)明
僅VidSts和VidAuth方式支持視頻下載功能。
使用播放器的視頻下載功能,需要在點(diǎn)播控制臺(tái)開(kāi)啟并配置下載模式,詳細(xì)操作請(qǐng)參見(jiàn)離線下載。
視頻下載支持?jǐn)帱c(diǎn)續(xù)傳。
操作步驟
可選:配置安全下載的加密校驗(yàn)文件。僅安全下載需要配置,普通下載無(wú)需配置。
說(shuō)明請(qǐng)確保配置的加密校驗(yàn)文件與App信息一致,否則會(huì)導(dǎo)致視頻下載失敗。
如果設(shè)置為安全下載方式,則需要將在點(diǎn)播控制臺(tái)生成的密鑰文件配置到播放器SDK中,用于視頻下載和播放的解密驗(yàn)證,密鑰文件的生成請(qǐng)參見(jiàn)開(kāi)啟安全下載。
建議在Application中配置一次即可,示例如下:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat所在的文件路徑"); //建議將encryptedApp.dat加密校驗(yàn)文件存放到手機(jī)中后,此處設(shè)置加密校驗(yàn)文件的手機(jī)本地文件路徑
創(chuàng)建并設(shè)置下載器。
創(chuàng)建下載器,通過(guò)AliDownloaderFactory創(chuàng)建。示例如下:
AliMediaDownloader mAliDownloader = null; ...... //創(chuàng)建下載器 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); //配置下載保存的路徑 mAliDownloader.setSaveDir("保存的文件夾地址");
設(shè)置監(jiān)聽(tīng)事件。
下載器提供了多個(gè)事件監(jiān)聽(tīng)。示例如下:
mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() { @Override public void onPrepared(MediaInfo mediaInfo) { //準(zhǔn)備下載項(xiàng)成功 } }); mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() { @Override public void onDownloadingProgress(int percent) { //下載進(jìn)度百分比 } @Override public void onProcessingProgress(int percent) { //處理進(jìn)度百分比 } }); mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { //下載出錯(cuò) } }); mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() { @Override public void onCompletion() { //下載成功 } });
準(zhǔn)備下載源。
通過(guò)
prepare
方法準(zhǔn)備下載源。下載源支持VidSts和VidAuth兩種方式。示例如下:VidSts
//創(chuàng)建VidSts VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("Vid信息");// 視頻ID(VideoId)。 aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");// STS臨時(shí)AK對(duì)的訪問(wèn)密鑰ID,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 aliyunVidSts.setAccessKeySecret"<yourAccessKeySecret>");// STS臨時(shí)AK對(duì)的訪問(wèn)密鑰,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 aliyunVidSts.setSecurityToken("<yourSecurityToken>");// STS安全令牌,需要調(diào)用STS服務(wù)的AssumeRole接口生成。 aliyunVidSts.setRegion("接入地域");// 點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 //準(zhǔn)備下載源 mAliDownloader.prepare(aliyunVidSts)
VidAuth
//創(chuàng)建VidAuth VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid信息");// 視頻ID(VideoId)。 vidAuth.setPlayAuth("<yourPlayAuth>");// 播放憑證,需要調(diào)用點(diǎn)播服務(wù)的GetVideoPlayAuth接口生成。 vidAuth.setRegion("接入地域");// 5.5.5.0及之后版本播放器SDK,本參數(shù)已棄用,無(wú)需設(shè)置region,播放器會(huì)自動(dòng)解析region;5.5.5.0之前版本播放器SDK,本參數(shù)必選,點(diǎn)播服務(wù)的接入地域,默認(rèn)為cn-shanghai。 //準(zhǔn)備下載源 mAliDownloader.prepare(vidAuth);
說(shuō)明源文件格式與輸出的下載文件格式保持一致,不支持更改。
準(zhǔn)備成功后,選擇下載項(xiàng)并開(kāi)始下載。
準(zhǔn)備成功后,會(huì)回調(diào)
OnPreparedListener
方法。返回的TrackInfo中會(huì)包含各視頻流的清晰度等信息,請(qǐng)選擇一個(gè)Track進(jìn)行下載,示例如下:public void onPrepared(MediaInfo mediaInfo) { //準(zhǔn)備下載項(xiàng)成功 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); //比如:下載第一個(gè)TrackInfo mAliDownloader.selectItem(trackInfos.get(0).getIndex()); //開(kāi)始下載 mAliDownloader.start(); }
(可選)更新下載源。
為了防止VidSts和VidAuth過(guò)期,您也可以更新下載源的信息后開(kāi)始下載。示例如下:
//更新下載源 mAliDownloader.updateSource(VidSts); //開(kāi)始下載 mAliDownloader.start();
下載成功或失敗后,釋放下載器。
下載成功后,在
onCompletion
或者onError
回調(diào)中調(diào)用release
釋放下載器。示例如下:mAliDownloader.stop(); mAliDownloader.release();
可選:刪除下載的文件。
下載過(guò)程中,或者下載完成后,可以刪除下載的文件。示例如下:
//通過(guò)對(duì)象刪除文件 mAliDownloader.deleteFile(); //通過(guò)靜態(tài)方法刪除,若刪除成功則返回0 AliDownloaderFactory.deleteFile("待刪除的下載文件夾路徑","視頻ID","視頻格式","下載的視頻索引");
后續(xù)操作
下載的視頻可以使用阿里云播放器進(jìn)行播放。具體方法如下:
下載完成后獲取視頻文件的絕對(duì)路徑。
String path = mAliDownloader.getFilePath();
通過(guò)點(diǎn)播UrlSource方式設(shè)置絕對(duì)路徑進(jìn)行播放。
UrlSource urlSource = new UrlSource(); urlSource.setUri("播放地址");//設(shè)置下載視頻的絕對(duì)路徑。 aliPlayer.setDataSource(urlSource);
視頻加密播放
點(diǎn)播視頻支持HLS標(biāo)準(zhǔn)加密、阿里云私有加密和DRM加密,直播視頻僅支持DRM加密。加密播放請(qǐng)參見(jiàn)視頻加密播放。
Native RTS播放
Android播放器SDK集成Native RTS SDK實(shí)現(xiàn)Native端低延時(shí)直播功能,詳情請(qǐng)參見(jiàn)阿里云播放器SDK集成Native RTS SDK實(shí)現(xiàn)說(shuō)明(Android端)。
異常處理
使用阿里云播放器播放視頻發(fā)生異常時(shí),可借助單點(diǎn)探查功能快速定位問(wèn)題,詳細(xì)內(nèi)容,請(qǐng)參見(jiàn)單點(diǎn)追查。