本文提供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提供了本地缓存(边播边缓存)的功能,能够让用户重复播放视频时,达到省流量的目的。需要在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方式播放视频的预加载。
开启本地缓存功能,详细操作请参见本地缓存。
获取FlutterAliPlayerMediaLoader实例。
//FlutterAliPlayerMediaLoader实例为单例,即无论获取多少次,创建的都是同一个实例。 fAliPlayerMediaLoader = FlutterAliPlayerMediaLoader();
配置回调,并开始加载。
/** * 设置加载状态回调 */ fAliPlayerMediaLoader.setOnLoadStatusListener((completeURL) { //加载完成 }, (cancelURL) { //加载取消 }, (String url, int code, String msg) { //加载异常 }); /** * 开始加载文件。异步加载。可以同时加载多个视频文件。 * @param url - 视频文件地址。 * @param duration - 加载的时长大小,单位:毫秒。 */ fAliPlayerMediaLoader.load("url","duration");
视频下载
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加密。加密播放请参见如何播放加密视频。