基础功能

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

设置播放源(DataSource)

  • Flutter播放器SDK支持4种点播播放方式,包括:VidAuth播放(视频点播用户推荐使用)、VidSts播放、UrlSource播放、加密播放。

  • Flutter播放器SDK仅支持1种直播播放方式,为UrlSource播放。

点播视频播放

点播VidAuth播放(推荐)

使用VidAuth播放方式播放点播视频,需要将播放器的vid属性设置为音视频ID,将playauth属性设置为音视频播放凭证。

  1. 音视频ID可以在音视频上传完成后通过控制台(路径:媒资库>音/视频。)或服务端接口(SearchMedia)获取。

  2. 音视频播放凭证可以调用GetVideoPlayAuth接口获取。建议您通过SDK方式来获取音视频播放凭证,免去自签名的麻烦。调用接口获取音视频播放凭证的示例请参见开发者门户

推荐视频点播用户采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有优势,对比详情请参见凭证方式与STS方式对比

void onViewPlayerCreated(viewId) async {
  // 将渲染的View设置给播放器
  fAliplayer.setPlayerView(viewId);
  //请注意 generatePlayerConfig 之前必须调用 createVidPlayerConfigGenerator()和setPreviewTime()
  FlutterAliplayer.createVidPlayerConfigGenerator();
  FlutterAliplayer.setPreviewTime(0);
  // 设置播放源
  FlutterAliplayer.generatePlayerConfig().then((value) {
      fAliplayer.setVidAuth(
          vid: "Vid信息",// 必选参数,视频ID(VideoId)。
          region: "接入地域",// 必选参数,点播服务的接入地域,默认为cn-shanghai。
          playAuth: "<yourPlayAuth>",// 必选参数,播放凭证,需要调用点播服务的GetVideoPlayAuth接口生成。
          playConfig: value);
        });    
  }
}

点播VidSts播放

使用点播VidSts播放方式播放点播视频是指用STS临时凭证而非点播音视频播放凭证播放。STS安全令牌和STS临时AK对(AccessKeyIdAccessKeySecret)需要提前获取,获取方式请参见获取STS Token

void onViewPlayerCreated(viewId) async {
  // 将渲染的View设置给播放器
  fAliplayer.setPlayerView(viewId);
  //请注意 generatePlayerConfig 之前必须调用 createVidPlayerConfigGenerator()和setPreviewTime()
  FlutterAliplayer.createVidPlayerConfigGenerator();
  FlutterAliplayer.setPreviewTime(0);
  // VidSts播放方式
  FlutterAliplayer.generatePlayerConfig().then((value) {
     fAliplayer.setVidSts(
          vid: "Vid信息",// 必选参数,视频ID(VideoId)。
          region: "接入地域",// 必选参数,点播服务的接入地域,默认为cn-shanghai。
          accessKeyId: "<yourAccessKeyId>",// 必选参数,STS临时AK对的访问密钥ID,需要调用STS服务的AssumeRole接口生成。
          accessKeySecret: "<yourAccessKeySecret>",// 必选参数,STS临时AK对的访问密钥,需要调用STS服务的AssumeRole接口生成。
          securityToken: "<yourSecurityToken>",// 必选参数,STS安全令牌,需要调用STS服务的AssumeRole接口生成。
      	  playConfig: value);
    	});
       
}

点播UrlSource播放

使用点播UrlSource播放方式播放点播视频,需要将播放器的setUrl属性设置为播放地址。播放地址可以是第三方点播地址或阿里云点播服务中的播放地址。

阿里云播放地址可以调用GetPlayInfo接口获取。建议您通过SDK方式来获取音视频播放地址,免去自签名的麻烦。调用接口获取音视频播放地址的示例请参见开发者门户

void onViewPlayerCreated(viewId) async {
  // 将渲染的View设置给播放器
  fAliplayer.setPlayerView(viewId);
  // 设置播放源
  switch (_playMode) {
      // UrlSource播放方式
    case ModeType.URL:
      this.fAliplayer.setUrl("播放地址"); // 必选参数,播放地址,可以是第三方点播地址,或阿里云点播服务中的播放地址。
      break;
    default:
  }
}

点播加密播放

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

直播视频播放

详情请参见Flutter播放器

说明
  • UrlSource是直接通过URL播放,VidSts,VidAuth是通过Vid进行播放。

  • 接入地域Region的设置,请参见点播地域标识

控制播放

Flutter框架播放器SDK支持开始、暂停、从指定时间点播放等主流操作。

自动播放

自动播放视频,由setAutoPlay接口实现(默认为关闭状态)。示例如下:

fAliplayer.setAutoPlay(true);

准备播放

准备播放视频,调用prepare接口开始读取并解析数据。若开启自动播放,数据解析完成后将开始自动播放视频。示例如下:

fAliplayer.prepare();

开始播放

开始播放视频,由play接口实现。示例如下:

 fAliplayer.play();

从指定时间开始播放

跳转到某个时刻进行播放,由seek接口实现。适用于用户拖拽进度条,或续播等需要从指定时间点开始播放的场景。示例如下:

////posotion为指定的时间,单位:毫秒。seekMode取值:FlutterAvpdef.ACCURATE(精准seek)和FlutterAvpdef.INACCURATE(非精准seek)
fAliplayer.seek(position,seekMode);

以指定位置起播,仅生效一次,适用于用户从指定时间点开始播放的场景。示例如下:

//以指定位置起播,每次prepare前调用,仅生效一次,time为指定的时间(毫秒),seekMode取值:FlutterAvpdef.ACCURATE(精准seek)和FlutterAvpdef.INACCURATE(非精准seek)
fAliplayer.setStartTime(time, seekMode);

暂停播放

暂停播放视频,由pause接口实现。示例如下:

fAliplayer.pause();

恢复播放

恢复播放视频,由play接口实现。示例如下:

fAliplayer.play();

停止播放

停止播放视频,由stop接口实现。示例如下:

fAliplayer.stop();

销毁播放器

销毁播放器实例,有同步和异步两种销毁方式,示例如下:

//同步销毁,内部会自动调用stop接口
fAliplayer.destroy();
//异步销毁,内部会自动调用stop接口
fAliplayer.releaseAsync();
说明

调用同步销毁接口需等待播放器资源完全释放后才返回。如果您对界面的响应速度有较高要求,建议使用异步销毁接口,并注意以下几点:

  1. 避免在异步销毁过程中对播放器对象执行任何其他操作。

  2. 无需在调用异步销毁之前手动停止播放器,因为该过程内部已经包含了异步化的停止流程。

播放器状态监听

Flutter播放器SDK支持设置播放器监听和监听播放状态。

设置播放器监听

播放器支持设置多个监听器。

  1. 创建手动播放时,OnPrepard必须设置,因为手动播放需要在OnPrepard回调中调用play开始播放。

  2. OnTrackReadyOnError较为重要,建议您设置。

以下示例仅展示部分接口,如下所示:

// 准备成功
fAliplayer.setOnPrepard((playerId) {});
// 首帧显示
fAliplayer.setOnRenderingStart((playerId) {});
// 视频宽高变化
fAliplayer.setOnVideoSizeChanged((width, height,playerId) {});
// 播放器状态变化
fAliplayer.setOnStateChanged((newState,playerId) {});
// 加载状态
fAliplayer.setOnLoadingStatusListener(
    loadingBegin: (playerId) {},
    loadingProgress: (percent, netSpeed,playerId) {},
    loadingEnd: (playerId) {});
// 拖动完成
fAliplayer.setOnSeekComplete((playerId) {});
// 播放器事件信息回调,包括buffer、当前播放进度等等信息,根据infoCode来判断,对应FlutterAvpdef.infoCode
fAliplayer.setOnInfo((infoCode, extraValue, extraMsg,playerId) {});
// 播放完成
fAliplayer.setOnCompletion((playerId) {});
// 设置流准备完成
fAliplayer.setOnTrackReady((playerId) {});
// 截图结果
fAliplayer.setOnSnapShot((path,playerId) {});
// 错误结果
fAliplayer.setOnError((errorCode, errorExtra, errorMsg,playerId) {});
// 切换流变化
fAliplayer.setOnTrackChanged((value,playerId) {});

监听播放状态

监听播放器的状态,onStateChanged 回调参数为当前播放器状态。示例如下:

fAliplayer.setOnStateChanged((newState, playerId) {
  //newState为播放状态
  switch (newState) {
    case FlutterAvpdef.AVPStatus_AVPStatusIdle: // 空转、闲时、静态
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusInitialzed: // 初始化完成
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusPrepared: // 准备完成
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusStarted: // 正在播放
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusPaused: // 播放暂停
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusStopped: // 播放停止
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusCompletion: // 播放完成
      break;
    case FlutterAvpdef.AVPStatus_AVPStatusError: // 播放错误
      break;
    default:
  }
});

设置显示模式

Flutter框架播放器SDK支持填充、旋转、镜像等显示设置。

填充

支持设置宽高比适应、宽高比填充和拉伸填充这3种画面填充模式,由setScalingMode接口实现。示例如下:

//设置宽高比适应(将按照视频宽高比等比缩小到view内部,不会有画面变形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALEASPECTFIT);
//设置宽高比填充(将按照视频宽高比等比放大,充满view,不会有画面变形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALEASPECTFILL);
//设置拉伸填充(如果视频宽高比例与view比例不一致,会导致画面变形)
fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALETOFILL);

旋转

画面按指定角度旋转,由setRotateMode接口实现。设置后还可查询旋转角度。示例如下:

//设置画面顺时针旋转0度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_0);
//设置画面顺时针旋转90度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_90);
//设置画面顺时针旋转180度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_180);
//设置画面顺时针旋转270度
fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_270);
//获取旋转角度
fAliplayer.getRotateMode();

镜像

支持水平镜像、垂直镜像和无镜像,由setMirrorMode接口实现。示例如下:

//设置无镜像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_NONE);
//设置水平镜像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_HORIZONTAL);
//设置垂直镜像
fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_VERTICAL); 

获取播放信息

Flutter框架播放器SDK支持获取当前的播放进度和播放时长。

获取当前播放进度

获取当前的播放时刻,在onInfo回调中获取,单位毫秒。示例如下:

fAliplayer.setOnInfo((infoCode,extraValue,extraMsg,playerId){
 if(infoCode==FlutterAvpdef.CURRENTPOSITION){
 //extraValue为当前播放进度
}
});

获取播放时长

获取视频总时长。需要在视频加载完成以后才可以获取到,可以在AVPEventPrepareDone事件后获取duration。示例如下:

fAliplayer.getMediaInfo().then((value){
 _videoDuration=value['duration'];
});

设置音量

设置音量包括音量调节和静音设置。

音量调节

调节音量大小,支持0~2倍,当音量大于1时,可能出现噪音,不推荐使用。由setVolume接口实现。设置后还可获取音量信息。示例如下:

//volume的值为0~2之间的实数。
fAliPlayer.setVolume(1);
//获取音量信息。
fAliPlayer.getVolume();

静音设置

将播放中的视频设置为静音状态,由setMute接口实现。示例如下:

fAliplayer.setMute(true);

倍速播放

Flutter框架播放器SDK提供了倍速播放视频的功能,通过设置setRate方法,能够以0.5倍~5倍速去播放视频。同时保持变声不变调。示例如下:

//设置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍数来设置,例如0.5倍、1倍、1.5倍等
fAliplayer.setRate(1.0);

多清晰度设置

如果使用VID方式(VidAuth(推荐)及VidSts)播放,无需额外设置。Flutter框架播放器SDK会从点播服务获取清晰度列表。Flutter框架播放器SDK支持获取和切换清晰度,UrlSource播放方式暂不支持此设置。

获取清晰度

当视频加载完成后,可以获取视频的清晰度。

fAliplayer.setOnPrepared((playerId) {
  fAliplayer.getMediaInfo().then((value){
        AVPMediaInfoinfo info=AVPMediaInfo.fromJson(value);
        info.tracks.forEach((element){
          if(element.trackType==3){
            // 清晰度
            String definition=element.trackDefinition;
            // 流索引
            int index=element.trackIndex;
          }
        });
      });    
});

切换清晰度

通过selectTrack方法切换清晰度,传递对应TrackInfoindex即可。

fAliplayer.selectTrack(trackIdx);

清晰度切换通知

清晰度切换成功回调。

fAliplayer.setOnTrackChanged((value,playerId){
 //有回调表示切换成功,切换失败接口暂未提供
});

循环播放

Flutter框架播放器SDK提供了循环播放视频的功能。调用setLoop开启循环播放,播放完成后,将会自动从头开始播放视频。示例如下:

fAliplayer.setLoop(true);

同时循环开始的回调将会使用onInfo通知。示例如下:

fAliplayer.setOnInfo((infoCode, extraValue, extraMsg, playerId) {
 if(infoCode == FlutterAvpdef.LOOPINGSTART){
 //循环播放开始通知
 }
});

获取播放日志

Flutter框架播放器SDK提供了获取播放日志的功能。调用enableConsoleLog开启日志打印。示例如下:

//开启日志打印功能
FlutterAliplayer.enableConsoleLog(true);
//设置日志级别,默认为AF_LOG_LEVEL_INFO,如需排查问题,可设置为AF_LOG_LEVEL_TRACE
FlutterAliplayer.setLogLevel(FlutterAvpdef.AF_LOG_LEVEL_INFO);

Flutter框架播放器SDK提供了获取帧级别日志的功能。调用setLogOption设置帧级别日志的打印。示例如下:

/// 设置日志等级,排查问题请设置日志级别为 AF_LOG_LEVEL_TRACE
FlutterAliplayer.setLogLevel(LogLevel.AF_LOG_LEVEL_INFO);
/// 开启/关闭 日志
FlutterAliplayer.enableConsoleLog(true);
/// 日志回调信息
FlutterAliplayer.setLogInfoCallBack((level, msg) {
   print("[LOG][LEVEL][$level] $msg");
});
/// 开启帧日志回调,一般在排查问题时打开
/// 选项value 0代表关闭 1代表打开
FlutterAliplayer.setLogOption(value);
说明

设置帧级别日志功能主要在排查故障场景下使用。