本文提供Flutter架構播放器SDK進階功能的使用樣本,完整功能說明請參見API說明。
播放
短視頻列表播放
建立列表播放器。
FlutterAliListPlayer fAliListPlayer = FlutterAliPlayerFactory.createAliListPlayer();添加資源、移除資源。
列表播放器目前只支援兩種播放方式:UrlSource播放和VidSts播放。
//uid是視頻的唯一標誌。用於區分視頻是否一樣。如果uid一樣,則認為是一樣的 fAliListPlayer.addUrlSource(url,uid); fAliListPlayer.addVidSource(vid,uid); fAliListPlayer.removeSource(uid);設定預先載入個數。
合理設定預先載入個數,能夠有效提高起播的速度。樣本如下:
//設定預先載入個數。總共載入的個數為: 1 + count*2。 fAliListPlayer.setPreloadCount(count);播放視頻源。
//uid為必填項,如果是URL播放方式,只需要uid即可,如果是STS方式,則需要填寫STS資訊 fAliListPlayer.moveTo();
軟硬解切換
Flutter架構播放器SDK提供了H.264、H.265的硬解碼能力,同時提供了setEnableHardwareDecoder開關。預設開,並且在硬解初始化失敗時,自動切換為軟解,保證視頻的正常播放。樣本如下:
//開啟硬解,預設開啟
fAliplayer.setEnableHardwareDecoder(enable);網路自適應切換視訊清晰度
Flutter架構播放器SDK支援多碼率自適應HLS、DASH視頻流。在prepare成功之後,通過getMediaInfo可以擷取到各個碼流的資訊,即TrackInfo。樣本如下:
fAliplayer.getMediaInfo().then((value) {
//value為map,value['tracks']可以擷取對應的TrackInfos 列表資訊,可以參考Demo中AVPMediaInfo info = AVPMediaInfo.fromJson(value); 瞭解如何解析TrackInfo
});在播放過程中,可以通過調用播放器的selectTrack方法切換播放的碼流,參數為TrackInfo中的trackIndex,切換的結果會在OnTrackChangedListener監聽之後會回調。
//多碼率切換
fAliplayer.selectTrack(index);
//多碼率切換並自適應
fAliplayer.selectTrack(-1);截圖
Flutter架構播放器SDK提供了對當前視頻截圖的功能,由setOnSnapShot介面實現。
//截圖成功監聽
fAliplayer.setOnSnapShot((path,playerId) {
});
//截圖,path為圖片儲存路徑
fAliplayer.snapshot(path);試看
Flutter架構播放器SDK通過配合點播服務配置,可以實現試看功能,VidAuth播放(推薦)和VidSts播放方式支援試看功能。如何配置和使用試看功能,請參見點播試看。
配置試看功能之後,通過setVidAuth介面的previewTime方法設定播放器的試看時間長度。樣本如下:
//previewTime為試看時間,單位:秒
//VidAuth播放方式
fAliplayer.setVidAuth(
vid: "填寫資源的vid",
region: "填寫資源的region",
playAuth: "填寫資源的region",
previewTime: "填寫試看時間,單位:秒");
//VidSts播放方式
fAliplayer.setVidSts(
vid: "填寫資源的vid",
region: "填寫資源的region",
accessKeyId: "填寫資源的鑒權id",
accessKeySecret: "填寫資源的鑒權密鑰",
securityToken: "填寫資源的安全Token",
previewTime: "填寫試看時間,單位:秒");其他配置
Flutter架構播放器SDK的其他播放配置。需要在prepare()方法之前設定給播放器。
var configMap = {
'mStartBufferDuration':_mStartBufferDurationController.text,//起播緩衝區時間長度,單位:毫秒
'mHighBufferDuration':_mHighBufferDurationController.text,//高緩衝時間長度,單位:毫秒
'mMaxBufferDuration':_mMaxBufferDurationController.text,//最大緩衝區時間長度,單位:毫秒
'mMaxDelayTime': _mMaxDelayTimeController.text,//直播最大延遲,單位:毫秒。注意:僅直播有效
'mNetworkTimeout': _mNetworkTimeoutController.text,//網路逾時時間,單位:毫秒
'mNetworkRetryCount':_mNetworkRetryCountController.text,///網路逾時重試次數,單位:毫秒
'mMaxProbeSize': _mMaxProbeSizeController.text,//最大probe大小
'mReferrer': _mReferrerController.text,//設定referrer
'mHttpProxy': _mHttpProxyController.text,//http代理
'mEnableSEI': mEnableSEI,//是否啟用SEI
'mClearFrameWhenStop': !mShowFrameWhenStop,///停止後是否清空畫面
'mDisableVideo': mDisableVideo,//禁用Video
'mDisableAudio': mDisableAudio,//禁用Audio
'mUserAgent':mUserAgent,//設定UserAgent
};
//應用配置
fAliplayer.setConfig(configMap);效能
預渲染
Flutter播放器SDK支援在起播之前快速渲染第一幀。
樣本如下:
fAliplayer.setOption(FlutterAvpdef.ALLOW_PRE_RENDER, 1);本機快取
Flutter架構播放器SDK提供了本機快取(邊播邊緩衝)的功能,能夠讓使用者重複播放視頻時,達到省流量的目的。需要在prepare之前給播放器配置enableLocalCache即可實現此功能。樣本如下:
/**
* 開啟本機快取,開啟之後,會緩衝到本地檔案中。
*
* @param enable - 本機快取功能開關。true:開啟本機快取,false:關閉,預設關閉。
* @param maxBufferMemoryKB - 5.4.7.1及以後版本已廢棄,暫無作用
* @param localCacheDir - 本機快取的檔案目錄,為絕對路徑。
* @param mDocTypeForIOS - iOS 沙箱目錄類型
*/
FlutterAliplayer.enableLocalCache(bool enable,String maxBufferMemoryKB,String localCacheDir,DocTypeForIOS mDocTypeForIOS);
/**
* 本機快取檔案清理相關配置。
*
* @param expireMin - 5.4.7.1及以後版本已廢棄,暫無作用。
* @param maxCapacityMB - 最大緩衝容量。單位:兆,預設值20GB,在清理時,如果緩衝總容量超過此大小,則會以cacheItem為粒度,按緩衝的最後時間排序,一個一個的刪除最舊的快取檔案,直到小於等於最大緩衝容量。
* @param freeStorageMB - 磁碟最小空餘容量。單位:兆,預設值0,在清理時,同最大緩衝容量,如果當前磁碟容量小於該值,也會按規則一個一個的刪除快取檔案,直到freeStorage大於等於該值或者所有緩衝都被清理掉。
*/
FlutterAliplayer.setCacheFileClearConfig(String expireMin,String maxCapacityMB,String freeStorageMB);開啟或關閉單個URL的本機快取
如果想要針對單個URL開啟或關閉本機快取功能,可以在player config中設定。樣本如下:
//擷取配置
fAliplayer.getPlayConfig().then((config){
//關閉/開啟本機快取
config.enableLocalCache = false;
//應用設定
fAliplayer.setPlayConfig(config);
});預先載入
Flutter架構播放器SDK提供預先載入的功能,預先載入是對本機快取功能的升級。通過設定視頻緩衝的記憶體佔用大小,達到提升視頻起播速度的效果。
預先載入功能的使用限制如下:
目前支援MP4、MP3、FLV、HLS等單個媒體檔案的載入。
僅支援UrlSource播放方式播放視頻的預先載入,暫不支援VidAuth、VidSts方式播放視頻的預先載入。
開啟本機快取功能,詳細操作請參見本機快取。
建立
FlutterAliMediaLoaderV2執行個體。FlutterAliMediaLoaderV2 loaderV2 = FlutterAliMediaLoaderV2();設定預先載入任務監聽。
onError:異常監聽。loaderV2.onError = (ErrorInfo error) { };onCompleted:任務完成監聽。loaderV2.onCompleted = (taskId, urlOrVid) { };onCanceled:任務取消監聽。loaderV2.onCanceled = (taskId, urlOrVid) { };
設定預先載入任務參數(可選,僅適用於多碼率)。
defaultQuality、defaultBandWidth、defaultResolution三者任選其一即可。PreloadConfig config = PreloadConfig(); config.duration = 1000; // 預設為 1000 config.defaultQuality = "FD"; config.defaultBandWidth = 200000; config.defaultResolution = 1920 * 1080; loaderV2.setPreloadConfig(config);添加預先載入任務並擷取任務ID。
VidAuth(推薦)
VidAuth auth = VidAuth( vid: "your videoId", playAuth: "your playAuth", region: "your region", ); loaderV2.addTask(auth).then((taskId) { print("MediaLoaderV2: taskId: $taskId"); });VidSts
VidSts vidSts = VidSts( vid: "your vid", accessKeyId: "your accessKeyId", accessKeySecret: "your accessKeySecret", securityToken: "your securityToken", ); loaderV2.addTask(vidSts).then((taskId) { print("MediaLoaderV2: taskId: $taskId"); });UrlSource
loaderV2.addTask(UrlSource(videoUrl: "videoUrl")).then((taskId) { print("MediaLoaderV2: taskId: $taskId"); });暫停預先載入任務。
loaderV2.pauseTask(taskId);恢複預先載入任務。
loaderV2.resumeTask(taskId);取消預先載入任務。
loaderV2.cancelTask(taskId);銷毀
FlutterAliMediaLoaderV2執行個體。loaderV2.dispose();
視頻下載
Flutter架構播放器SDK提供了點播服務視頻的下載功能,允許使用者通過阿里雲播放器將視頻緩衝至本地觀看。同時,提供了普通下載和安全下載兩種下載方式。
普通下載
下載後的視頻資料未經過阿里雲加密,使用者可以用第三方播放器播放。
安全下載
下載後的視頻資料經過阿里雲加密。第三方播放器無法播放,僅支援使用阿里雲的播放器SDK進行播放。
使用說明
僅VidSts和VidAuth方式可使用視訊下載功能。
使用播放器的視頻下載功能,需要在點播控制台開啟並配置下載模式,詳細操作請參見離線下載。
視頻下載支援斷點續傳。
操作步驟
可選:配置安全下載的加密校正檔案。僅安全下載需要配置,普通下載無需配置。
說明請確保配置的加密校正檔案與App資訊一致,否則會導致視頻下載失敗。
如果設定為安全下載方式,則需要將在點播控制台產生的密鑰檔案配置到播放器SDK中,用於視頻下載和播放的解密驗證,密鑰檔案的產生請參見安全下載。
配置一次即可,樣本如下:
FlutterAliPlayerFactory.initService(byteData);建立並設定下載器。
樣本如下:
FlutterAliDownloader downloader = FlutterAliDownloader.init(); ///設定儲存路徑 downloader.setSaveDir(path)開始下載。
調用了開始下載後,會自動化佈建監聽,並將回調資訊返回。樣本如下:
///1.prepare ///參數說明:type可選值為FlutterAvpdef.DOWNLOADTYPE_STS / FlutterAvpdef.DOWNLOADTYPE_AUTH 。當type為DOWNLOADTYPE_STS時候,必填參數為:{vid,accessKeyId,accessKeySecret,securityToken},當 type 為 DOWNLOADTYPE_AUTH 時,必須填參數為 {vid,playAuth} downloader.prepare(type, vid).then((value) { //value為map,對應Demo中的DownloadModel自訂下載類 DownloadModel downloadModel = DownloadModel.fromJson(value); //2.selectItem,根據不同的trackInfo來確定需要下載哪個清晰度 List<TrackInfoModel> trackInfos = downloadModel.trackInfos; downloader.selectItem(vid,trackInfos[0].index); //3.start downloader.start(vid, trackInfos[0].index).listen((event) { //說明:event可能會有多種資訊,可參考FlutterAvpdef.EventChanneldef中的資訊,以下為具體說明: if (event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_PROGRESS){ //下載進度百分比資訊,擷取下載進度百分比:event[EventChanneldef.DOWNLOAD_PROGRESS] }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_PROCESS){ //處理進度百分比資訊,擷取處理進度百分比:event[EventChanneldef.DOWNLOAD_PROCESS] }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_COMPLETION){ //下載完成,可以通過 event['vid']、event['index'] 擷取對應的vid和index用於判斷是哪個視頻下載完成,event['savePath'] 用於擷取下載完成視頻的本地路徑 }else if(event[EventChanneldef.TYPE_KEY] == EventChanneldef.DOWNLOAD_ERROR){ //下載失敗,可以通過 event['vid']、event['index'] 擷取對應的vid和index用於判斷是哪個視頻下載失敗,event['errorCode']、event['errorMsg'] 可以擷取對應的錯誤碼,和錯誤資訊 } }); });停止下載。
樣本如下:
downloader.stop(vid, index)刪除下載。
刪除下載選項,如果刪除成功,則下載的本地檔案也會隨之刪除。樣本如下:
downloader.delete(vid, index)釋放下載對象。
當某個下載對象不再使用時,使用
release方法將其釋放,防止記憶體流失。樣本如下:downloader.release(vid, index)
視頻加密播放
點播視訊支援HLS標準加密、阿里雲私人加密和DRM加密。加密播放請參見如何播放加密視頻。