本文为您提供了使用Flutter端播放器功能的操作步骤及SDK示例,通过本文内容您可以快速了解如何通过SDK使用Flutter端播放器功能。

播放功能

Flutter端播放器视频播放SDK操作步骤及功能示例如下:

  1. 创建播放器
    FlutterAliplayer fAliplayer = FlutterAliPlayerFactory.createAliPlayer();

    创建多实例播放器

    需要在Flutter层管理playerId,在播放器的回调中会返回对应的playerId,用来通知Flutter层。
    FlutterAliplayer fAliplayer = FlutterAliPlayerFactory.createAliPlayer(playerId: playerId);
  2. 设置监听
    本文示例仅展示部分接口,如下所示:
    //准备成功
    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) {});
  3. 设置渲染视图
    @override
    Widget build(BuildContext context) {
      var x = 0.0;
      var y = 0.0;
      Orientation orientation = MediaQuery.of(context).orientation;
      var width = MediaQuery.of(context).size.width;
    
      var height;
      if (orientation == Orientation.portrait) {
        height = width * 9.0 / 16.0;
      } else {
        height = MediaQuery.of(context).size.height;
      }
      AliPlayerView aliPlayerView = AliPlayerView(
          onCreated: onViewPlayerCreated,
          x: x,
          y: y,
          width: width,
          height: height);
      return OrientationBuilder(
        builder: (BuildContext context, Orientation orientation) {
          return Scaffold(
            body: Column(
              children: [
                Container(
                    color: Colors.black,
                    child: aliPlayerView,
                    width: width,
                    height: height),
              ],
            ),
          );
        },
      );
  4. 设置播放源
    void onViewPlayerCreated(viewId) async {
      ///将渲染的View设置给播放器
      fAliplayer.setPlayerView(viewId);
      //设置播放源
      switch (_playMode) {
        //URL播放方式
        case ModeType.URL:
          this.fAliplayer.setUrl(_dataSourceMap[DataSourceRelated.URL_KEY]);
          break;
        //STS播放方式
        case ModeType.STS:
          this.fAliplayer.setVidSts(
              vid: _dataSourceMap[DataSourceRelated.VID_KEY],
              region: _dataSourceMap[DataSourceRelated.REGION_KEY],
              accessKeyId: _dataSourceMap[DataSourceRelated.ACCESSKEYID_KEY],
              accessKeySecret:
                  _dataSourceMap[DataSourceRelated.ACCESSKEYSECRET_KEY],
              securityToken: _dataSourceMap[DataSourceRelated.SECURITYTOKEN_KEY],
              definitionList: _dataSourceMap[DataSourceRelated.DEFINITION_LIST],
              previewTime: _dataSourceMap[DataSourceRelated.PREVIEWTIME_KEY]);
          break;
        //AUTH播放方式
        case ModeType.AUTH:
          this.fAliplayer.setVidAuth(
              vid: _dataSourceMap[DataSourceRelated.VID_KEY],
              region: _dataSourceMap[DataSourceRelated.REGION_KEY],
              playAuth: _dataSourceMap[DataSourceRelated.PLAYAUTH_KEY],
              definitionList: _dataSourceMap[DataSourceRelated.DEFINITION_LIST],
              previewTime: _dataSourceMap[DataSourceRelated.PREVIEWTIME_KEY]);
          break;
        default:
      }
    }
  5. 自动播放
    说明 如果开启了自动播放,则调用prepare()方法即可,播放器在调用prepare()方法成功后会自动播放。

    如果未开启自动播放,则需要在setOnPrepard()准备成功回调中,调用fAliplayer.play()方法开始播放。

    fAliplayer.setAutoPlay(true);
    fAliplayer.prepare();
  6. 暂停播放

    暂停播放后,如果想恢复播放直接调用play()方法即可。

    fAliplayer.pause();
  7. 停止播放

    停止播放后,如果想恢复播放需要重新走一遍播放流程:调用prepare()方法再调用play()方法。

    fAliplayer.stop();
  8. 销毁
    fAliplayer.release();
  9. 设置Seek指针
    //seekMode可选值:FlutterAvpdef.ACCURATE(精准seek) 和FlutterAvpdef.INACCURATE(非精准seek)
    fAliplayer.seek(position,seekMode);
  10. 循环播放
    fAliplayer.setLoop(true);
  11. 静音、音量控制
    fAliplayer.setMute(true);
    //设置播放器音量,范围0~1.
    fAliPlayer.setVolume(1);
  12. 倍速播放
    //可选值:0.5,1.0,1.5,2.0
    fAliplayer.setRate(1.0);
  13. 切换多码率,自动码率切换
    //在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);
  14. 画面旋转、填充、镜像操作
    //设置画面的镜像模式:水平镜像,垂直镜像,无镜像。
    fAliplayer.setMirrorMode(FlutterAvpdef.AVP_MIRRORMODE_NONE);
    //设置画面旋转模式:旋转0度,90度,180度,270度
    fAliplayer.setRotateMode(FlutterAvpdef.AVP_ROTATE_0);
    //设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充
    fAliplayer.setScalingMode(FlutterAvpdef.AVP_SCALINGMODE_SCALETOFILL);
  15. 边播边缓存

    需要在 prepare 之前设置给播放器

    var map = {
      "mMaxSizeMB": _mMaxSizeMBController.text,///缓存目录的最大占用空间
      "mMaxDurationS": _mMaxDurationSController.text,///设置能够缓存的单个文件的最大时长
      "mDir": _mDirController.text,///缓存目录
      "mEnable": mEnableCacheConfig,///是否开启缓存功能
    };
    fAliplayer.setCacheConfig(map);
  16. 播放器其他配置

    需要在prepare()方法之前设置给播放器。

    var configMap = {
      'mStartBufferDuration':_mStartBufferDurationController.text,///起播缓冲区时长
      'mHighBufferDuratio':_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
    };
    widget.fAliplayer.setConfig(configMap);

列表播放功能

  1. 创建列表播放器
    FlutterAliListPlayer fAliListPlayer = FlutterAliPlayerFactory.createAliListPlayer();
  2. 添加资源、移除资源

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

    //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();

视频下载功能

阿里云SDK提供了点播服务视频的下载功能,能够通过VidSts和VidAuth下载点播服务上的视频。同时,下载的方式提供了安全下载和普通下载的模式(在控制台设置)。

  1. 创建并设置下载器
    FlutterAliDownloader donwloader = FlutterAliDownloader.init();
    ///设置保存路径
    donwloader.setSaveDir(path)
    下载SDK支持私有加密的下载。为了保证安全性,需要配置一个加密校验文件到SDK。
    FlutterAliPlayerFactory.initService(byteData);
  2. 开始下载
    调用了开始下载后,会自动设置监听,并将回调信息返回。示例如下:
    ///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'] 可以获取对应的错误码,和错误信息
            }
          });
      });
  3. 停止下载
    downloader.stop(vid, index)
  4. 删除下载
    删除下载选项,如果删除成功,则下载的本地文件也会随之删除。示例如下:
    downloader.delete(vid, index)
  5. 释放下载对象
    当某个下载对象不再使用时,使用release方法将其释放,防止内存泄漏。示例如下:
    downloader.release(vid, index)