superplayer_widget
目录复制到自己的 flutter 工程下。pubspec.yaml
下添加依赖。superplayer_widget:# 该路径根据superplayer_widget存放路径改变path: ../superplayer_widgetsuper_player:git:url: https://github.com/LiteAVSDK/Player_Flutterpath: Flutterref: main
superPlayer
依赖。pubspec.yaml
。super_player:path: ../
super_player:git:url: https://github.com/LiteAVSDK/Player_Flutterpath: Flutterref: main
@override Widget build(BuildContext context) { return MaterialApp( localizationsDelegates: [ SuperPlayerWidgetLocals.delegate,// ...... your app other delegate ], supportedLocales: [ Locale.fromSubtags(languageCode: 'en'), Locale.fromSubtags(languageCode: 'zh'),// ....... other language ],// ...... your app other code ); }
superplayer_widget
的依赖包,如下所示:import 'package:superplayer_widget/demo_superplayer_lib.dart';
String licenceURL = ""; // 获取到的 licence urlString licenceKey = ""; // 获取到的 licence keySuperPlayerPlugin.setGlobalLicense(licenceURL, licenceKey);
SuperPlayerPlugin.setGlobalEnv("GDPR");
SuperPlayerController _controller = SuperPlayerController(context);
FTXVodPlayConfig config = FTXVodPlayConfig();// 如果不配置preferredResolution,则在播放多码率视频的时候优先播放720 * 1280分辨率的码率config.preferredResolution = 720 * 1280;_controller.setPlayConfig(config);
_controller.onSimplePlayerEventBroadcast.listen((event) {String evtName = event["event"];if (evtName == SuperPlayerViewEvent.onStartFullScreenPlay) {setState(() {_isFullScreen = true;});} else if (evtName == SuperPlayerViewEvent.onStopFullScreenPlay) {setState(() {_isFullScreen = false;});} else {print(evtName);}});
Widget _getPlayArea() {return Container(height: 220,child: SuperPlayerView(_controller),);}
@overrideWidget build(BuildContext context) {return WillPopScope(child: Container(decoration: BoxDecoration(image: DecorationImage(image: AssetImage("images/ic_new_vod_bg.png"),fit: BoxFit.cover,)),child: Scaffold(backgroundColor: Colors.transparent,appBar: _isFullScreen? null: AppBar(backgroundColor: Colors.transparent,title: const Text('SuperPlayer'),),body: SafeArea(child: Builder(builder: (context) => getBody(),),),),),onWillPop: onWillPop);}Future<bool> onWillPop() async {return !_controller.onBackPress();}
SuperPlayerModel model = SuperPlayerModel();model.videoURL = "http://1400329073.vod2.myqcloud.com/d62d88a7vodtranscq1400329073/59c68fe75285890800381567412/adp.10.m3u8";_controller.playWithModelNeedLicence(model);
SuperPlayerModel model = SuperPlayerModel();model.appId = 1500005830;model.videoId = new SuperPlayerVideoId();model.videoId.fileId = "8602268011437356984";// psign 即播放器签名,签名介绍和生成方式参见链接:https://www.tencentcloud.com/document/product/266/38099model.videoId.pSign = "psignXXX"_controller.playWithModelNeedLicence(model);
@overridevoid dispose() {// must invoke when page exit._controller.releasePlayer();super.dispose();}
_controller.playWithModelNeedLicence(model);
参数名 | 类型 | 描述 |
appId | int | 应用 appId。fileId 播放必填。 |
videoURL | String | 视频 url,url 播放必填。 |
multiVideoURLs | List<String> | 多码率 url,多码率 url 播放必填。 |
defaultPlayIndex | int | 默认播放码率序号,配合 multiVideoURLs 使用。 |
videoId | SuperPlayerVideoId | fileId 存储对象,以下会有详细介绍。 |
title | String | 视频标题,用户可设置该字段来自定义标题,从而覆盖播放器内部从服务器请求的标题。 |
coverUrl | String | 从腾讯服务器拉取的封面图片,该值会在 SuperVodDataLoader 中被自动赋值。 |
customeCoverUrl | String | 自定义视频封面,该字段会被优先判断,可以通过定义该参数来实现自定义封面。 |
duration | int | 视频时长,单位秒。 |
videoDescription | String | 视频描述。 |
videoMoreDescription | String | 视频详细描述。 |
playAction | int | action 包括 PLAY_ACTION_AUTO_PLAY、PLAY_ACTION_MANUAL_PLAY和PLAY_ACTION_PRELOAD,以下对参数含义会有详细介绍。 |
参数名 | 类型 | 描述 |
fileId | String | 文件 id。必填。 |
psign | String | 播放器签名,签名介绍和生成方式。 |
_controller.pause();
_controller.resume();
_controller.reStart();
_controller.resetPlayer();
_controller.releasePlayer();
_controller.onBackPress();
_controller.switchStream(videoQuality);
参数名 | 类型 | 描述 |
index | int | 清晰度序号 |
bitrate | int | 清晰度码率 |
width | int | 该清晰度下视频的宽度 |
height | int | 该清晰度下视频的高度 |
name | String | 清晰度简称 |
title | String | 用于显示的清晰度名称 |
url | String | 清晰度 url,用于多码率下的清晰度 url,非必填 |
_controller.seek(progress);
参数名 | 类型 | 描述 |
progress | double | 需要调整到的时间,单位 秒 |
_controller.setPlayConfig(config);
参数名 | 类型 | 描述 |
connectRetryCount | int | 播放器重连次数,当 SDK 与服务器异常断开连接时,SDK 会尝试与服务器重连.通过该值设置SDK重连次数 |
connectRetryInterval | int | 播放器重连间隔,当 SDK 与服务器异常断开连接时,SDK 会尝试与服务器重连.通过该值设置两次重连间隔时间 |
timeout | int | 播放器连接超时时间 |
playerType | int | 播放器类型,0 点播,1 直播,2 直播回看 |
headers | Map | 自定义http headers |
enableAccurateSeek | bool | 是否精确seek,默认true |
autoRotate | bool | 播放mp4文件时,若设为 true则根据文件中的旋转角度自动旋转。旋转角度可在PLAY_EVT_CHANGE_ROTATION事件中获得。默认 true |
smoothSwitchBitrate | bool | 平滑切换多码率 HLS,默认false。设为false时,可提高多码率地址打开速度; 设为true,在 IDR 对齐时可平滑切换码率 |
cacheMp4ExtName | String | 缓存 mp4 文件扩展名,默认mp4 |
progressInterval | int | 设置进度回调间隔,若不设置,SDK默认间隔0.5秒回调一次,单位毫秒 |
maxBufferSize | int | 最大播放缓冲大小,单位 MB。此设置会影响 playableDuration,设置越大,提前缓存的越多 |
maxPreloadSize | int | 预加载最大缓冲大小,单位:MB |
firstStartPlayBufferTime | int | 首缓需要加载的数据时长,单位ms,默认值为100ms |
nextStartPlayBufferTime | int | 缓冲时(缓冲数据不够引起的二次缓冲,或者 seek 引起的拖动缓冲)最少要缓存多长的数据才能结束缓冲,单位ms,默认值为250ms |
overlayKey | String | HLS 安全加固加解密key |
overlayIv | String | HLS 安全加固加解密Iv |
extInfoMap | Map | 一些不必周知的特殊配置 |
enableRenderProcess | bool | 是否允许加载后渲染后处理服务,默认开启,开启后超分插件如果存在,默认加载 |
preferredResolution | int | 优先播放的分辨率,preferredResolution = width * height |
_controller.enableHardwareDecode(enable);
SuperPlayerState superPlayerState = _controller.getPlayerState();
参数名 | 类型 | 描述 |
INIT | SuperPlayerState | 初始状态 |
PLAYING | SuperPlayerState | 播放中 |
PAUSE | SuperPlayerState | 暂停中 |
LOADING | SuperPlayerState | 缓冲中 |
END | SuperPlayerState | 播放结束 |
_controller.enterPictureInPictureMode(backIcon: "images/ic_pip_play_replay.png",playIcon: "images/ic_pip_play_normal.png",pauseIcon: "images/ic_pip_play_pause.png",forwardIcon: "images/ic_pip_play_forward.png");
参数名 | 类型 | 描述 |
backIcon | String | 回退按钮图标,由于android平台限制,图标大小不得超过1M,可不传,不传则使用系统自带图标 |
playIcon | String | 播放按钮图标,由于android平台限制,图标大小不得超过1M,可不传,不传则使用系统自带图标 |
pauseIcon | String | 暂停按钮图标,由于android平台限制,图标大小不得超过1M,可不传,不传则使用系统自带图标 |
forwardIcon | String | 快进按钮图标,由于android平台限制,图标大小不得超过1M,可不传,不传则使用系统自带图标 |
_controller.onSimplePlayerEventBroadcast.listen((event) {String evtName = event["event"];if (evtName == SuperPlayerViewEvent.onStartFullScreenPlay) {setState(() {_ isFullScreen = true;});} else if (evtName == SuperPlayerViewEvent.onStopFullScreenPlay) {setState(() {_isFullScreen = false;});} else {print(evtName);}});
状态 | 含义 |
onStartFullScreenPlay | 进入全屏播放。 |
onStopFullScreenPlay | 退出全屏播放。 |
onSuperPlayerDidStart | 播放开始通知。 |
onSuperPlayerDidEnd | 播放结束通知。 |
onSuperPlayerError | 播放错误通知。 |
onSuperPlayerBackAction | 返回事件。 |
SuperPlayerModel model = SuperPlayerModel();model.appId = 1500005830;model.videoId = new SuperPlayerVideoId();model.videoId.fileId = "8602268011437356984";model.title = "云点播";SuperVodDataLoader loader = SuperVodDataLoader();// model中的必要参数会在SuperVodDataLoader中直接赋值loader.getVideoData(model, (resultModel) {_controller.playWithModelNeedLicence(resultModel);})
SuperPlayerPlugin.instance.onExtraEventBroadcast.listen((event) {int eventCode = event["event"];if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_EXIT) {// exit pip mode} else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_REQUEST_START) {// enter pip mode} else if (eventCode == TXVodPlayEvent.EVENT_PIP_MODE_ALREADY_ENTER) {// already enter pip mode} else if (eventCode == TXVodPlayEvent.EVENT_IOS_PIP_MODE_WILL_EXIT) {// will exit pip mode} else if (eventCode == TXVodPlayEvent.EVENT_IOS_PIP_MODE_RESTORE_UI) {// restore UI only support iOS}});
参数名 | 值 | 描述 |
NO_ERROR | 0 | 启动成功,没有错误。 |
ERROR_PIP_LOWER_VERSION | -101 | Android 版本过低,不支持画中画模式。 |
ERROR_PIP_DENIED_PERMISSION | -102 | 画中画模式权限未打开,或者当前设备不支持画中画。 |
ERROR_PIP_ACTIVITY_DESTROYED | -103 | 当前界面已经销毁。 |
ERROR_IOS_PIP_DEVICE_NOT_SUPPORT | -104 | 设备或系统版本不支持(iPad iOS9+ 才支持 PIP)。 |
ERROR_IOS_PIP_PLAYER_NOT_SUPPORT | -105 | 播放器不支持。 |
ERROR_IOS_PIP_VIDEO_NOT_SUPPORT | -106 | 视频不支持。 |
ERROR_IOS_PIP_IS_NOT_POSSIBLE | -107 | PIP 控制器不可用。 |
ERROR_IOS_PIP_FROM_SYSTEM | -108 | PIP 控制器报错。 |
ERROR_IOS_PIP_PLAYER_NOT_EXIST | -109 | 播放器对象不存在。 |
ERROR_IOS_PIP_IS_RUNNING | -110 | PIP 功能已经运行。 |
ERROR_IOS_PIP_NOT_RUNNING | -111 | PIP 功能没有启动。 |
int result = await SuperPlayerPlugin.isDeviceSupportPip();if(result == TXVodPlayEvent.NO_ERROR) {// pip support}
TXPipController.instance.setNavigatorHandle((params) {navigatorKey.currentState?.push(MaterialPageRoute(builder: (_) => DemoSuperPlayer(initParams: params)));});
TXPipPlayerRestorePage
方法,设置之后,当即将进入画中画时,控制器会回调void onNeedSavePipPageState(Map<String, dynamic> params)
方法,此时可以在 params 中存入当前页面需要的参数。TXPipController.instance.setPipPlayerPage(this);
SuperPlayerView
的_onEnterPipMode
内部方法进入画中画,也可以自行调用SuperPlayerController
的enterPictureInPictureMode
方法进入。isEnableDownload
打开,该字段默认关闭。SuperPlayerModel model = SuperPlayerModel();// 打开视频下载能力model.isEnableDownload = true;
SuperPlayerController
的startDownload
方法,可以直接下载当前播放器正在播放的视频,对应的是当前播放视频的清晰度。也可是使用DownloadHelper
下载指定视频,如下:DownloadHelper.instance.startDownloadBySize(videoModel, videoWidth, videoHeight);
DownloadHelper
的 startDownloadBySize,可下载指定分辨率的视频,如果没有该分辨率,会下载相近分辨率的视频。
除了以上接口以外,也可选择传入画质 ID 或者 mediaInfo 直接下载。// QUALITY_240P 240p// QUALITY_360P 360P// QUALITY_480P 480p// QUALITY_540P 540p// QUALITY_720P 720p// QUALITY_1080P 1080p// QUALITY_2K 2k// QUALITY_4K 4k// quality参数可以自定义,取分辨率宽高最小值(如分辨率为1280*720, 期望下载此分辨率的流,quality传入 QUALITY_720P)// 播放器 SDK 会选择小于或等于传入分辨率的流进行下载// 使用画质ID下载DownloadHelper.instance.startDownload(videoModel, qualityId);// 使用mediaInfo下载DownloadHelper.instance.startDownloadOrg(mediaInfo);
CommonUtils
提供了getDownloadQualityBySize
方法,用于将分辨率转为对应的画质 ID。CommonUtils.getDownloadQualityBySize(width, height);
DownloadHelper
的stopDownload
方法可以停止对应的视频下载,示例如下:DownloadHelper.instance.stopDownload(mediaInfo);
DownloadHelper
的getMediaInfoByCurrent
方法获取,或者使用TXVodDownloadController
的getDownloadList
获得下载信息。DownloadHelper
的deleteDownload
方法,可以删除对应的视频。bool deleteResult = await DownloadHelper.instance.deleteDownload(downloadModel.mediaInfo);
DownloadHelper
提供了基本的isDownloaded
方法判断视频是否已经下载。也可以注册监听来实时判断下载状态。DownloadHelper
对下载事件进行了分发,可通过如下代码进行事件注册。// 注册下载事件监听DownloadHelper.instance.addDownloadListener(FTXDownloadListener((event, info) {// 下载状态变化}, (errorCode, errorMsg, info) {// 下载错误回调}));// 移除下载事件监听DownloadHelper.instance.removeDownloadListener(listener);
TXVodDownloadController.instance.getDownloadInfo(mediaInfo)
方法或者TXVodDownloadController.instance.getDownloadList()
方法直接查询 mediaInfo 中的 downloadState 来判断下载状态。TXVodDownloadController.instance.getDownloadInfo(mediaInfo)
和TXVodDownloadController.instance.getDownloadList()
获得到的视频信息中有个 playPath 字段,使用 TXVodPlayerController 直接播放即可。controller.startVodPlay(mediaInfo.playPath);
Landscape left
和Landscaoe right
。确保 iOS 设备能够支持横屏。SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SuperPlayerPlugin.startVideoOrientationService();
SuperPlayerPlugin.instance.onEventBroadcast
对 flutter 侧发送旋转事件。播放器组件内部也会自动根据该事件旋转播放器。监听使用范例如下:SuperPlayerPlugin.instance.onExtraEventBroadcast.listen((event) {int eventCode = event["event"];if (eventCode == TXVodPlayEvent.EVENT_ORIENTATION_CHANGED ) {int orientation = event[TXVodPlayEvent.EXTRA_NAME_ORIENTATION];// do orientation}});
本页内容是否解决了您的问题?