進(jìn)階功能
本文提供Flutter框架播放器SDK進(jìn)階功能的使用示例,完整功能說(shuō)明請(qǐng)參見(jiàn)API說(shuō)明。
播放
短視頻列表播放
創(chuàng)建列表播放器。
FlutterAliListPlayer fAliListPlayer = FlutterAliPlayerFactory.createAliListPlayer();
添加資源、移除資源。
列表播放器目前只支持兩種播放方式:UrlSource播放和VidSts播放。
//uid是視頻的唯一標(biāo)志。用于區(qū)分視頻是否一樣。如果uid一樣,則認(rèn)為是一樣的 fAliListPlayer.addUrlSource(url,uid); fAliListPlayer.addVidSource(vid,uid); fAliListPlayer.removeSource(uid);
設(shè)置預(yù)加載個(gè)數(shù)。
合理設(shè)置預(yù)加載個(gè)數(shù),能夠有效的提高起播的速度。示例如下:
//設(shè)置預(yù)加載個(gè)數(shù)。總共加載的個(gè)數(shù)為: 1 + count*2。 fAliListPlayer.setPreloadCount(count);
播放視頻源。
//uid為必填項(xiàng),如果是URL播放方式,只需要uid即可,如果是STS方式,則需要填寫STS信息 fAliListPlayer.moveTo();
軟硬解切換
Flutter框架播放器SDK提供了H.264、H.265的硬解碼能力,同時(shí)提供了setEnableHardwareDecoder
開(kāi)關(guān)。默認(rèn)開(kāi),并且在硬解初始化失敗時(shí),自動(dòng)切換為軟解,保證視頻的正常播放。示例如下:
//開(kāi)啟硬解,默認(rèn)開(kāi)啟
fAliplayer.setEnableHardwareDecoder(enable);
網(wǎng)絡(luò)自適應(yīng)切換視頻清晰度
Flutter框架播放器SDK支持多碼率自適應(yīng)HLS、DASH視頻流。在prepare
成功之后,通過(guò)getMediaInfo
可以獲取到各個(gè)碼流的信息,即TrackInfo
。示例如下:
fAliplayer.getMediaInfo().then((value) {
//value為map,value['tracks']可以獲取對(duì)應(yīng)的TrackInfos 列表信息,可以參考Demo中AVPMediaInfo info = AVPMediaInfo.fromJson(value); 了解如何解析TrackInfo
});
在播放過(guò)程中,可以通過(guò)調(diào)用播放器的selectTrack
方法切換播放的碼流,參數(shù)為TrackInfo
中的trackIndex
,切換的結(jié)果會(huì)在OnTrackChangedListener
監(jiān)聽(tīng)之后會(huì)回調(diào)。
//多碼率切換
fAliplayer.selectTrack(index);
//多碼率切換并自適應(yīng)
fAliplayer.selectTrack(-1);
截圖
Flutter框架播放器SDK提供了對(duì)當(dāng)前視頻截圖的功能,由setOnSnapShot
接口實(shí)現(xiàn)。
//截圖成功監(jiān)聽(tīng)
fAliplayer.setOnSnapShot((path,playerId) {
});
//截圖,path為圖片保存路徑
fAliplayer.snapshot(path);
試看
Flutter框架播放器SDK通過(guò)配合點(diǎn)播服務(wù)配置,可以實(shí)現(xiàn)試看功能,VidAuth播放(推薦)和VidSts播放方式支持試看功能。如何配置和使用試看功能,請(qǐng)參見(jiàn)點(diǎn)播試看。
配置試看功能之后,通過(guò)setVidAuth
接口的previewTime
方法設(shè)置播放器的試看時(shí)長(zhǎng)。示例如下:
//previewTime為試看時(shí)間,單位:秒
//VidAuth播放方式
fAliplayer.setVidAuth(
vid: "填寫資源的vid",
region: "填寫資源的region",
playAuth: "填寫資源的region",
previewTime: "填寫試看時(shí)間,單位:秒");
//VidSts播放方式
fAliplayer.setVidSts(
vid: "填寫資源的vid",
region: "填寫資源的region",
accessKeyId: "填寫資源的鑒權(quán)id",
accessKeySecret: "填寫資源的鑒權(quán)密鑰",
securityToken: "填寫資源的安全Token",
previewTime: "填寫試看時(shí)間,單位:秒");
其他配置
Flutter框架播放器SDK的其他播放配置。需要在prepare()
方法之前設(shè)置給播放器。
var configMap = {
'mStartBufferDuration':_mStartBufferDurationController.text,//起播緩沖區(qū)時(shí)長(zhǎng),單位:毫秒
'mHighBufferDuration':_mHighBufferDurationController.text,//高緩沖時(shí)長(zhǎng),單位:毫秒
'mMaxBufferDuration':_mMaxBufferDurationController.text,//最大緩沖區(qū)時(shí)長(zhǎng),單位:毫秒
'mMaxDelayTime': _mMaxDelayTimeController.text,//直播最大延遲,單位:毫秒。注意:僅直播有效
'mNetworkTimeout': _mNetworkTimeoutController.text,//網(wǎng)絡(luò)超時(shí)時(shí)間,單位:毫秒
'mNetworkRetryCount':_mNetworkRetryCountController.text,///網(wǎng)絡(luò)超時(shí)重試次數(shù),單位:毫秒
'mMaxProbeSize': _mMaxProbeSizeController.text,//最大probe大小
'mReferrer': _mReferrerController.text,//設(shè)置referrer
'mHttpProxy': _mHttpProxyController.text,//http代理
'mEnableSEI': mEnableSEI,//是否啟用SEI
'mClearFrameWhenStop': !mShowFrameWhenStop,///停止后是否清空畫面
'mDisableVideo': mDisableVideo,//禁用Video
'mDisableAudio': mDisableAudio,//禁用Audio
'mUserAgent':mUserAgent,//設(shè)置UserAgent
};
//應(yīng)用配置
fAliplayer.setConfig(configMap);
性能
預(yù)渲染
Flutter播放器SDK支持在起播之前快速渲染第一幀。示例如下:
fAliplayer.setOption(FlutterAvpdef.ALLOW_PRE_RENDER, 1);
本地緩存
Flutter框架播放器SDK提供了本地緩存(邊播邊緩存)的功能,能夠讓用戶重復(fù)播放視頻時(shí),達(dá)到省流量的目的。需要在prepare
之前給播放器配置enableLocalCache
即可實(shí)現(xiàn)此功能。示例如下:
/**
* 開(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ì)路徑。
* @param mDocTypeForIOS - iOS 沙盒目錄類型
*/
FlutterAliplayer.enableLocalCache(bool enable,String maxBufferMemoryKB,String localCacheDir,DocTypeForIOS mDocTypeForIOS);
/**
* 本地緩存文件清理相關(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大于等于該值或者所有緩存都被清理掉。
*/
FlutterAliplayer.setCacheFileClearConfig(String expireMin,String maxCapacityMB,String freeStorageMB);
開(kāi)啟或關(guān)閉單個(gè)URL的本地緩存
如果想要針對(duì)單個(gè)URL開(kāi)啟或關(guān)閉本地緩存功能,可以在player config
中設(shè)置。示例如下:
//獲取配置
fAliplayer.getPlayConfig().then((config){
//關(guān)閉/開(kāi)啟本地緩存
config.enableLocalCache = false;
//應(yīng)用設(shè)置
fAliplayer.setPlayConfig(config);
});
預(yù)加載
Flutter框架播放器SDK提供預(yù)加載的功能,預(yù)加載是對(duì)本地緩存功能的升級(jí)。通過(guò)設(shè)置視頻緩存的內(nèi)存占用大小,達(dá)到提升視頻起播速度的效果。
預(yù)加載功能的使用限制如下:
目前支持MP4、MP3、FLV、HLS等單個(gè)媒體文件的加載。
僅支持UrlSource播放方式播放視頻的預(yù)加載,暫不支持VidAuth、VidSts方式播放視頻的預(yù)加載。
開(kāi)啟本地緩存功能,詳細(xì)操作請(qǐng)參見(jiàn)本地緩存。
獲取FlutterAliPlayerMediaLoader實(shí)例。
//FlutterAliPlayerMediaLoader實(shí)例為單例,即無(wú)論獲取多少次,創(chuàng)建的都是同一個(gè)實(shí)例。 fAliPlayerMediaLoader = FlutterAliPlayerMediaLoader();
配置回調(diào),并開(kāi)始加載。
/** * 設(shè)置加載狀態(tài)回調(diào) */ fAliPlayerMediaLoader.setOnLoadStatusListener((completeURL) { //加載完成 }, (cancelURL) { //加載取消 }, (String url, int code, String msg) { //加載異常 }); /** * 開(kāi)始加載文件。異步加載。可以同時(shí)加載多個(gè)視頻文件。 * @param url - 視頻文件地址。 * @param duration - 加載的時(shí)長(zhǎng)大小,單位:毫秒。 */ fAliPlayerMediaLoader.load("url","duration");
視頻下載
Flutter框架播放器SDK提供了點(diǎn)播服務(wù)視頻的下載功能,允許用戶通過(guò)阿里云播放器將視頻緩存至本地觀看。同時(shí),提供了普通下載和安全下載兩種下載方式。
普通下載
下載后的視頻數(shù)據(jù)未經(jīng)過(guò)阿里云加密,用戶可以用第三方播放器播放。
安全下載
下載后的視頻數(shù)據(jù)經(jīng)過(guò)阿里云加密。第三方播放器無(wú)法播放,僅支持使用阿里云的播放器SDK進(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)安全下載。
配置一次即可,示例如下:
FlutterAliPlayerFactory.initService(byteData);
創(chuàng)建并設(shè)置下載器。
示例如下:
FlutterAliDownloader downloader = FlutterAliDownloader.init(); ///設(shè)置保存路徑 downloader.setSaveDir(path)
開(kāi)始下載。
調(diào)用了開(kāi)始下載后,會(huì)自動(dòng)設(shè)置監(jiān)聽(tīng),并將回調(diào)信息返回。示例如下:
///1.prepare ///參數(shù)說(shuō)明:type可選值為FlutterAvpdef.DOWNLOADTYPE_STS / FlutterAvpdef.DOWNLOADTYPE_AUTH 。當(dāng)type為DOWNLOADTYPE_STS時(shí)候,必填參數(shù)為:{vid,accessKeyId,accessKeySecret,securityToken},當(dāng) type 為 DOWNLOADTYPE_AUTH 時(shí),必須填參數(shù)為 {vid,playAuth} downloader.prepare(type, vid).then((value) { //value為map,對(duì)應(yīng)Demo中的DownloadModel自定義下載類 DownloadModel downloadModel = DownloadModel.fromJson(value); //2.selectItem,根據(jù)不同的trackInfo來(lái)確定需要下載哪個(gè)清晰度 List<TrackInfoModel> trackInfos = downloadModel.trackInfos; downloader.selectItem(vid,trackInfos[0].index); //3.start downloader.start(vid, trackInfos[0].index).listen((event) { //說(shuō)明:event可能會(huì)有多種信息,可參考FlutterAvpdef.EventChanneldef中的信息,以下為具體說(shuō)明: if (event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_PROGRESS){ //下載進(jìn)度百分比信息,獲取下載進(jìn)度百分比:event[EventChanneldef.DOWNLOAD_PROGRESS] }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_PROCESS){ //處理進(jìn)度百分比信息,獲取處理進(jìn)度百分比:event[EventChanneldef.DOWNLOAD_PROCESS] }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_COMPLETION){ //下載完成,可以通過(guò) event['vid']、event['index'] 獲取對(duì)應(yīng)的vid和index用于判斷是哪個(gè)視頻下載完成,event['savePath'] 用于獲取下載完成視頻的本地路徑 }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_ERROR){ //下載失敗,可以通過(guò) event['vid']、event['index'] 獲取對(duì)應(yīng)的vid和index用于判斷是哪個(gè)視頻下載失敗,event['errorCode']、event['errorMsg'] 可以獲取對(duì)應(yīng)的錯(cuò)誤碼,和錯(cuò)誤信息 } }); });
停止下載。
示例如下:
downloader.stop(vid, index)
刪除下載。
刪除下載選項(xiàng),如果刪除成功,則下載的本地文件也會(huì)隨之刪除。示例如下:
downloader.delete(vid, index)
釋放下載對(duì)象。
當(dāng)某個(gè)下載對(duì)象不再使用時(shí),使用
release
方法將其釋放,防止內(nèi)存泄漏。示例如下:downloader.release(vid, index)
視頻加密播放
點(diǎn)播視頻支持HLS標(biāo)準(zhǔn)加密、阿里云私有加密和DRM加密。加密播放請(qǐng)參見(jiàn)如何播放加密視頻。