进阶功能

本文提供Flutter框架播放器SDK进阶功能的使用示例,完整功能说明请参见API说明。

播放

短视频列表播放

  1. 创建列表播放器。

    FlutterAliListPlayer fAliListPlayer = FlutterAliPlayerFactory.createAliListPlayer();
  2. 添加资源、移除资源。

    列表播放器目前只支持两种播放方式:UrlSource播放和VidSts播放。

    //uid是视频的唯一标志。用于区分视频是否一样。如果uid一样,则认为是一样的
    fAliListPlayer.addUrlSource(url,uid);
    fAliListPlayer.addVidSource(vid,uid);
    fAliListPlayer.removeSource(uid);
  3. 设置预加载个数。

    合理设置预加载个数,能够有效的提高起播的速度。示例如下:

    //设置预加载个数。总共加载的个数为: 1 + count*2。
    fAliListPlayer.setPreloadCount(count);
  4. 播放视频源。

    //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方式播放视频的预加载。

  1. 开启本地缓存功能,详细操作请参见本地缓存

  2. 获取FlutterAliPlayerMediaLoader实例。

    //FlutterAliPlayerMediaLoader实例为单例,即无论获取多少次,创建的都是同一个实例。
    fAliPlayerMediaLoader = FlutterAliPlayerMediaLoader();
  3. 配置回调,并开始加载。

    /**
     * 设置加载状态回调
     */
    fAliPlayerMediaLoader.setOnLoadStatusListener((completeURL) {
          //加载完成
        }, (cancelURL) {
          //加载取消
        }, (String url, int code, String msg) {
          //加载异常
        });
    /**
     * 开始加载文件。异步加载。可以同时加载多个视频文件。
     * @param url - 视频文件地址。
     * @param duration - 加载的时长大小,单位:毫秒。
     */
    fAliPlayerMediaLoader.load("url","duration");

视频下载

Flutter框架播放器SDK提供了点播服务视频的下载功能,允许用户通过阿里云播放器将视频缓存至本地观看。同时,提供了普通下载和安全下载两种下载方式。

  • 普通下载

    下载后的视频数据未经过阿里云加密,用户可以用第三方播放器播放。

  • 安全下载

    下载后的视频数据经过阿里云加密。第三方播放器无法播放,仅支持使用阿里云的播放器SDK进行播放。

使用说明

  • 仅VidSts和VidAuth方式支持视频下载功能。

  • 使用播放器的视频下载功能,需要在点播控制台开启并配置下载模式,详细操作请参见离线下载

  • 视频下载支持断点续传。

操作步骤

  1. 可选:配置安全下载的加密校验文件。仅安全下载需要配置,普通下载无需配置。

    说明

    请确保配置的加密校验文件与App信息一致,否则会导致视频下载失败。

    如果设置为安全下载方式,则需要将在点播控制台生成的密钥文件配置到播放器SDK中,用于视频下载和播放的解密验证,密钥文件的生成请参见安全下载

    配置一次即可,示例如下:

    FlutterAliPlayerFactory.initService(byteData);
  2. 创建并设置下载器。

    示例如下:

    FlutterAliDownloader downloader = FlutterAliDownloader.init();
    ///设置保存路径
    downloader.setSaveDir(path)
  3. 开始下载。

    调用了开始下载后,会自动设置监听,并将回调信息返回。示例如下:

    ///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'] 可以获取对应的错误码,和错误信息
     }
     });
     });
  4. 停止下载。

    示例如下:

    downloader.stop(vid, index)
  5. 删除下载。

    删除下载选项,如果删除成功,则下载的本地文件也会随之删除。示例如下:

    downloader.delete(vid, index)
  6. 释放下载对象。

    当某个下载对象不再使用时,使用release方法将其释放,防止内存泄漏。示例如下:

    downloader.release(vid, index)

视频加密播放

点播视频支持HLS标准加密、阿里云私有加密和DRM加密。加密播放请参见如何播放加密视频