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

播放功能

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

  1. 创建播放器
    通过FlutterAliPlayerFactory可以创建两种播放器:FlutterAliplayerFlutterAliListPlayer。示例如下:
    FlutterAliplayer fAliplayer;
    fAliplayer = FlutterAliPlayerFactory().createAliPlayer();
    如果播放的视频是通过播放器SDK安全下载后的本地文件,则需要设置一个加密校验信息。
    var bytes = await rootBundle.load("encryptedApp.dat文件的路径");
    FlutterAliPlayerFactory().initService(bytes.buffer.asUint8List());
  2. 设置监听
    播放器提供了多种监听事件,比如:onPreparedonCompletion等事件。示例如下:
    fAliplayer.setOnCompletion(() {
        //播放完成事件
    });
    
    fAliplayer.setOnError((errorCode, errorExtra, errorMsg) {
        //出错事件
    });
    
    fAliplayer.setOnPrepared(() {
        //准备完成事件
    });
    
    fAliplayer.setOnVideoSizeChanged((width, height) {
        //视频分辨率变化回调
    });
    
    fAliplayer.setOnRenderingStart(() {
        //首帧渲染显示事件
    });
    
    fAliplayer.setOnInfo((infoCode, extraValue, extraMsg) {
        /其他信息的事件,type包括了:循环播放开始,缓冲位置,当前播放位置,自动播放开始等
    });
    
    fAliplayer.setOnLoadingStatusListener(
        loadingBegin: () {
            //缓冲开始
        },
        loadingProgress: (percent, netSpeed) {
            //缓冲进度
        },
        loadingEnd: () {
            //缓冲结束
        });
    });
    
    fAliplayer.setOnSubtitleHide((trackIndex, subtitleID) {
        //隐藏字幕事件
    });
    
    fAliplayer.setOnSubtitleShow((trackIndex, subtitleID, subtitle) {
        //显示字幕事件
    });
    
    fAliplayer.setOnTrackChanged((value) {
        //切换音视频流或者清晰度事件
    });
    
    fAliplayer.setOnStateChanged((newState) {
        //播放器状态改变事件
    });
    
    fAliplayer.setOnSnapShot((path) {
        //截图事件
    });
  3. 设置播放源
    播放器支持4种播放源:
    • VidSts播放源
    • VidAuth播放源
    • VidMps播放源
    • UrlSource播放源
    说明 UrlSource播放源直接使用URL播放,其余的三种通过vid进行播放:VidSts和VidAuth播放源点播用户都可以使用,VidMps播放源仅限MPS用户使用。
    以VidSts播放源举例,示例如下:
    //设置播放源
    fAliplayer.setVidSts(vid:视频vid,region:接入地区,accessKeyId:临时akId,accessKeySecret:临时akSecret,securityToken:安全token);
    //准备播放
    fAliplayer.prepare();
  4. 设置显示的View
    Flutter中使用的是原生的View, Flutter层对应AliPlayerView类。示例如下:
    //x,y对应坐标点
    AliPlayerView aliPlayerView = AliPlayerView(
            onCreated: onViewPlayerCreated,
            x: x,
            y: y,
            width: width,
            height: height);
    说明 当显示的View创建成功后,会根据回调给播放器SDK自动设置新建的View。
  5. 播放控制
    您可以自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、拖动(Seek),其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用播放后开始播放当前画面。示例如下:
    //开始播放
    fAliplayer.play();
    //暂停播放
    fAliplayer.pause();
    //停止播放
    fAliplayer.stop();
    // 跳转到。不精准。精准seek对应FlutterAvpdef.ACCURATE,不精准seek对应FlutterAvpdef.INACCURATE
    fAliplayer.seekTo(int position, int seekMode);
    //释放。释放后播放器将不可再被使用。
    fAliplayer.destroy();
  6. 切换码率
    播放器SDK支持HLS多码率地址播放。在使用prepare方法成功之后,通过getMediaInfo方法可以获取到各个码流的信息,即TrackInfo。示例如下:
    fAliplayer.getMediaInfo().then((value) {
        val trackInfos = value['tracks'];
    };
    在播放过程中,可以通过调用播放器的selectTrack方法切换播放的码流。示例如下:
    int index = trackInfo.getIndex();
    fAliplayer.selectTrack(index);
    切换的结果会在OnTrackChangedListener监听之后回调(在调用selectTrack方法之前设置)。示例如下:
    fAliplayer.setOnTrackChanged((value) {
    });
  7. 自动播放
    播放器SDK支持自动播放视频的设置。在prepare方法之前调用setAutoPlay方法设置。示例如下:
    fAliplayer.setAutoPlay(true);
  8. 循环播放
    播放器SDK提供了循环播放视频的功能。调用setLoop方法开启循环播放,播放完成后,将会自动从头开始播放视频。示例如下:
    fAliplayer.setLoop(true);
    同时循环开始的回调将使用onInfo进行通知。示例如下:
    fAliplayer.setOnInfo((infoCode, extraValue, extraMsg) {
        if (infoCode == FlutterAvpdef.LOOPINGSTART) {
            //循环播放开始事件。
        }
    });
  9. 画面旋转、填充、镜像操作
    播放器SDK提供过了多种设置,可以对画面进行精确的控制。包括设置画面旋转模式,设置画面缩放模式,设置镜像模式。示例如下:
    //设置画面的镜像模式:水平镜像,垂直镜像,无镜像。
    fAliplayer.setMirrorMode(int mirrorMode)
    //设置画面旋转模式:旋转0度,90度,180度,270度
    fAliplayer.setRotateMode(int rotateMode);
    //设置画面缩放模式:宽高比填充,宽高比适应,拉伸填充
    fAliplayer.setScalingMode(int scaleMode);
  10. 音量控制
    播放器SDK 提供了视频的音量控制功能。调用setMute方法设置播放器静音。调用setVolume方法控制音量大小,取值范围:0~1。示例如下:
    //设置播放器静音
    fAliplayer.setMute(true);
    //设置播放器音量,范围0~1.
    fAliplayer.setVolume(1f);
  11. 倍数播放
    播放器SDK提供了倍数播放视频的功能,通过设置setRate方法,能够以0.5倍~2倍数去播放视频。同时保持变声不变调。示例如下:
    //设置倍速播放:支持0.5~2倍速的播放
    fAliplayer.setRate(1.0f);
  12. 截图功能
    播放器SDK提供了对当前视频截图的功能。截取的是原始的数据,并转为BitMap形式返回。回调接口为OnSnapShot。示例如下:
    //设置截图回调
    fAliplayer.setOnSnapShot((path) {
        //返回图片保存到本地的路径
    });
    //截取当前播放的画面,设置截图后图片保存路径
    fAliplayer.snapshot(String path);
  13. 边播边缓存
    播放器SDK提供了边播边缓存的功能,能够让用户在重复播放视频时不消耗流量,达到省流量的目的。只需在prepare方法之前给播放器配置实现此功能。示例如下:
    var map = {
        "mMaxSizeMB": 缓存目录的最大占用空间,
        "mMaxDurationS": 设置能够缓存的单个文件的最大时长,
        "mDir": 缓存目录,
        "mEnable": 是否开启边播边缓存,
    };
    fAliPlayer.setCacheConfig(map);
  14. 试看功能

    当设置试看的时长,通过播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。

    播放器SDK 通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth两种方式。以VidSts为例,示例如下:
    fAliplayer.setVidSts(vid:视频vid,region:接入地区,accessKeyId:临时akId,accessKeySecret:临时akSecret,securityToken:安全token,previewTime:试看时长);
  15. 硬解开关
    播放器SDK提供了H.264,H.265的硬解码能力,同时提供硬解开关。默认开启,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下:
    //开启硬解。默认开启
    fAliplayer.setEnableHardwareDecoder(bool isHardWare);
    如果从硬解自动切换为软解,将通过onInfo回调实现,示例如下:
    fAliplayer.setOnInfo((infoCode, extraValue, extraMsg) {
        if (infoCode == FlutterAvpdef.SWITCHTOSOFTWAREVIDEODECODER) {
            //切换到软解
        }
    });
  16. 设置黑名单
    播放器SDK提供了硬解的黑名单机制。对于明确不能使用硬解播放的机器,可以直接使用软解,避免无效的操作。示例如下:
    //获取设备信息
    flutterAliPlayre.createDeviceInfo().then((value) {
        //type : {FlutterAvpdef.BLACK_DEVICES_H264 / FlutterAvpdef.BLACK_DEVICES_HEVC}
        fAliplayer.addBlackDevice(type,value);
    });
  17. 设置PlayerConfig
    PlayerConfig包括设置Referer、设置UserAgent、网络重试时间和次数、缓存和延迟控制、HTTP Header设置等。示例如下:
    var configMap = {
        'mStartBufferDuration':起播缓冲区时长。单位ms,
        'mHighBufferDuratio':高缓冲时长。单位ms,
        'mMaxBufferDuration':最大缓冲区时长。单位ms,
        'mMaxDelayTime': 最大延迟。注意:直播有效。单位ms,
        'mNetworkTimeout': 网络超时时间。单位ms。,
        'mNetworkRetryCount':网络重试次数,
        'mMaxProbeSize': 最大probe大小。单位 byte 。,
        'mReferrer': referrer,
        'mHttpProxy': http代理,
        'mEnableSEI': 是否启用SEI,
        'mClearFrameWhenStop': 停止后是否清空画面,
    };
    fAliplayer.setConfig(configMap);

列表播放功能

  1. 创建列表播放器
    FlutterAliListPlayer fAliListPlayer;
    FlutterAliPlayerFactory().createAliListPlayer();
  2. 设置预加载个数
    合理设置预加载个数,能够有效的提高起播的速度。示例如下:
    //设置预加载个数。总共加载的个数为: 1 + count*2。
    fAliListPlayer.setPreloadCount(count);
  3. 添加或移除多个播放源
    列表播放支持多种播放源:VidSts和URL播放源。URL播放源为直接使用URL地址,vid为点播视频ID。示例如下:
    //添加vid源
    fAliListPlayer.addVidSource({@required vid, @required uid});
    //添加URL源
    fAliListPlayer.addUrlSource({@required url, @required uid});
    //移除某个源
    fAliListPlayer.removeSource(String uid);
  4. 播放视频源
    添加了一个或多个播放源之后,调用moveTo方法可以自动播放某个源。示例如下:
    //url和vid 都可以使用此接口,url播放方式只需要填写uid;sts播放方式,需要更新sts信息
    fAliListPlayer.moveTo({@required String uid,String accId,String accKey,String token,String region});
  5. 播放上一个或下一个视频
    播放器提供了moveToPrev和moveToNext接口用于播放上一个和下一个视频。示例如下:
    //url的播放方式,不需要传递参数即可,
    fAliListPlayer.moveToNext({@required accId,@required accKey,@required token,@required region}));
    fAliListPlayer.moveToPre({@required accId,@required accKey,@required token,@required region}));

视频下载功能

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

  1. 创建并设置下载器
    FlutterAliDownloader flutterAliDownloader;
    flutterAliDownloader = FlutterAliDownloader.init();
    //配置下载保存的路径
    flutterAliDownloader.setSaveDir(String path);
    下载SDK支持私有加密的下载。为了保证安全性,需要配置一个加密校验文件到SDK。
    var bytes = await rootBundle.load("encryptedApp.dat文件的路径");
    FlutterAliPlayerFactory().initService(bytes.buffer.asUint8List());
  2. 准备下载
    调用prepare方法后,等同于设置了下载源并同时执行prepare方法的操作。示例如下:
    flutterAliDownloader.prepare(String type, String vid, {int index,String accessKeyId,String accessKeySecret,
          String securityToken, String playAuth})
  3. 开始下载
    调用了开始下载后,会自动设置监听,并将回调信息返回。示例如下:
    //vid 对应视频的 vid,index 对应清晰度的 index
    flutterAliDownloader.start(String vid, int index).listen((event){
        if(event["method"] == "download_progress"){
            //下载进度事件
            val progress = event["download_progress"];
        }else if(event["method"] == "download_process"){
            //处理进度事件
            vall process = event["download_process"];
        }else if(event["method"] == "download_completion"){
            //下载完成事件
        }else if(event["method"] == "download_error"){
            //下载错误事件
            //错误码
            val errorCode = event['errorCode'];
            //错误信息
            val errorMsg = event['errorMsg'];
        }
        
    });
  4. 停止下载
    flutterAliDownloader.stop(String vid, int index)
  5. 删除下载
    删除下载选项,如果删除成功,则下载的本地文件也会随之删除。示例如下:
    flutterAliDownloader.delete(String vid, int index)
  6. 释放下载对象
    当某个下载对象不再使用时,使用release方法将其释放,防止内存泄漏。示例如下:
    flutterAliDownloader.release(String vid, int index)
  7. 更新下载鉴权信息
    flutterAliDownloader.updateSource(String type, String vid, String index,{String accessKeyId,
            String accessKeySecret,String securityToken,String playAuth})
  8. 下载配置
    flutterAliDownloader.setDownloaderConfig(String vid, String index,{String userAgent,String referrer,
          String httpProxy,int connectTimeoutS,int networkTimeoutMs})
  9. 获取下载的文件路径
    flutterAliDownloader.getFilePath(String vid, int index)