TXVodPlayerController _controller = TXVodPlayerController();
// 监听视频宽高变化,设置合适的宽高比例,也可自行设置宽高比例,视频纹理也会根据比例进行相应拉伸_controller.onPlayerNetStatusBroadcast.listen((event) async {double w = (event["VIDEO_WIDTH"]).toDouble();double h = (event["VIDEO_HEIGHT"]).toDouble();if (w > 0 && h > 0) {setState(() {_aspectRatio = 1.0 * w / h;});}});
@overrideWidget build(BuildContext context) {return Container(decoration: BoxDecoration(image: DecorationImage(image: AssetImage("images/ic_new_vod_bg.png"),fit: BoxFit.cover,)),child: Scaffold(backgroundColor: Colors.transparent,appBar: AppBar(backgroundColor: Colors.transparent,title: const Text('点播'),),body: SafeArea(child: Container(height: 150,color: Colors.black,child: Center(child: _aspectRatio > 0? AspectRatio(aspectRatio: _aspectRatio,child: TXPlayerVideo(controller: _controller),) : Container(),),))));}
// 初始化播放器,分配共享纹理await _controller.initialize();
// 播放视频资源String _url ="http://1400329073.vod2.myqcloud.com/d62d88a7vodtranscq1400329073/59c68fe75285890800381567412/adp.10.m3u8";await _controller.startVodPlay(_url);
// psign 即播放器签名,签名介绍和生成方式参见链接:https://www.tencentcloud.com/document/product/266/38099TXPlayInfoParams params = TXPlayInfoParams(appId: 1252463788,fileId: "4564972819220421305", psign: "psignxxxxxxx");await _controller.startVodPlayWithParams(params);
TXLiveConstants.PLAY_ERR_GET_PLAYINFO_FAIL
事件,反之收到TXLiveConstants.PLAY_EVT_GET_PLAYINFO_SUCC
表示请求成功。@overridevoid dispose() {_controller.dispose();super.dispose();}
// 开始播放_controller.startVodPlay(url)
// 暂停播放_controller.pause();
// 恢复播放_controller.resume();
// 结束播放_controller.stopPlay(true);
// 释放controller_controller.dispose();
double time = 600; // double,单位为 秒// 调整进度_controller.seek(time);
int pdtTimeMs = 600; // 单位为 毫秒_controller.seekToPdtTime(time);
double startTimeInSecond = 60; // 单位:秒_controller.setStartTime(startTimeInSecond); // 设置开始播放时间_controller.startVodPlay(url);
setRate
设置点播播放速率来完成,支持快速与慢速播放,如0.5X、1.0X、1.2X、2X等。// 设置1.2倍速播放_controller.setRate(1.2);
// 设置循环播放_controller.setLoop(true);// 获取当前循环播放状态_controller.isLoop();
// 设置静音,true 表示开启静音, false 表示关闭静音_controller.setMute(true);
autoPlay
为 NO,此时播放器会正常加载,但视频不会立刻开始播放。_controller.setAutoPlay(false); // 设置为非自动播放_controller.startVodPlay(url); // startVodPlay 后会加载视频,加载成功后不会自动播放// ......// 在播放器界面上展示广告// ......_controller.resume(); // 广告展示完调用 resume 开始播放视频
FTXVodPlayConfig playConfig = FTXVodPlayConfig();Map<String, String> httpHeaders = {'Referer': 'Referer Content'};playConfig.headers = httpHeaders;_controller.setConfig(playConfig);
_controller.stopPlay(true);_controller.enableHardwareDecode(true);_controller.startVodPlay(url);
List _supportedBitrates = (await _controller.getSupportedBitrates())!;; //获取多码率数组int index = _supportedBitrates[i]; // 指定要播的码率下标_controller.setBitrateIndex(index); // 切换码率到想要的清晰度
_controller.setBitrateIndex(int)
切换码率。切换过程中,会重新拉取另一条流的数据,SDK 针对腾讯云的多码率文件做过优化,可以做到切换无卡顿。_controller.setBitrateIndex(-1); //index 参数传入-1
_controller.setBitrateIndex(int)
切换其它码率,切换后码流自适应也随之关闭。FTXVodPlayConfig playConfig = FTXVodPlayConfig();/// 设为true,可平滑切换码率, 设为false时,可提高多码率地址打开速度playConfig.smoothSwitchBitrate = true;_controller.setConfig(playConfig);
onPlayerEventBroadcast
接口监听播放器事件,进度通知会通过 PLAY_EVT_PLAY_PROGRESS 事件回调到您的应用程序。_controller.onPlayerEventBroadcast.listen((event) async {if(event["event"] == TXVodPlayEvent.PLAY_EVT_PLAY_PROGRESS) {// 更多详细请查看iOS或者Android原生SDK状态码// 可播放时长,即加载进度, 单位是毫秒double playableDuration = event[TXVodPlayEvent.EVT_PLAYABLE_DURATION_MS].toDouble();// 播放进度, 单位是秒int progress = event[TXVodPlayEvent.EVT_PLAY_PROGRESS].toInt();// 视频总长, 单位是秒int duration = event[TXVodPlayEvent.EVT_PLAY_DURATION].toInt();}});
onPlayerNetStatusBroadcast
接口监听播放器的网络状态,如: NET_STATUS_NET_SPEED
。_controller.onPlayerNetStatusBroadcast.listen((event) {(event[TXVodNetEvent.NET_STATUS_NET_SPEED]).toDouble();});
onPlayerNetStatusBroadcast
的NET_STATUS_VIDEO_WIDTH
和NET_STATUS_VIDEO_HEIGHT
获取视频的宽和高getWidth()
和getHeight()
获取当前宽高。_controller.onPlayerNetStatusBroadcast.listen((event) {double w = (event[TXVodNetEvent.NET_STATUS_VIDEO_WIDTH]).toDouble();double h = (event[TXVodNetEvent.NET_STATUS_VIDEO_HEIGHT]).toDouble();});// 获取视频宽高,需要在收到播放器的PLAY_EVT_VOD_PLAY_PREPARED 事件回调后才返回值_controller.getWidth();_controller.getHeight();
FTXVodPlayConfig playConfig = FTXVodPlayConfig();playConfig.maxBufferSize = 10; /// 播放时最大缓冲大小。单位:MB_controller.setConfig(playConfig);
//设置播放引擎的全局缓存目录和缓存大小,//单位MBSuperPlayerPlugin.setGlobalMaxCacheSize(200);//设置播放引擎的全局缓存目录SuperPlayerPlugin.setGlobalCacheFolderPath("postfixPath");
startVodPlay
之前添加字幕和配置字幕样式,在收到VOD_PLAY_EVT_VOD_PLAY_PREPARED
事件后,调用 selectTrack 选择字幕。 添加字幕后,并不会主动加载字幕, 调用 selectTrack
后,才会加载字幕,字幕选择成功会有 VOD_PLAY_EVT_SELECT_TRACK_COMPLETE
事件回调。选择字幕后,字幕文本内容会通过 TXVodPlayEvent.EVENT_SUBTITLE_DATA
。// 添加外挂字幕,传入 字幕url, 字幕名称, 字幕类型, 建议在启动播放器前添加controller.addSubtitleSource("https://mediacloud-76607.gzc.vod.tencent-cloud.com/DemoResource/subtitleVTT.vtt", "subtitleName", TXVodPlayEvent.VOD_PLAY_MIMETYPE_TEXT_SRT)// 开始播放视频后,监听字幕文本内容回调_controller.onPlayerEventBroadcast.listen((event) async {if(event["event"] == TXVodPlayEvent.EVENT_SUBTITLE_DATA) {// 字幕文本内容,可用于显示String subtitleDataStr = event[TXVodPlayEvent.EXTRA_SUBTITLE_DATA] ?? "";}});
// 开始播放视频后,选中添加的外挂字幕, 在收到 VOD_PLAY_EVT_VOD_PLAY_PREPARED 事件后调用_controller.onPlayerEventBroadcast.listen((event) async {if(event["event"] == TXVodPlayEvent.PLAY_EVT_VOD_PLAY_PREPARED) {List<TXTrackInfo> trackInfoList = await _vodPlayerController.getSubtitleTrackInfo();for (TXTrackInfo tempInfo in trackInfoList) {if(tempInfo.name == "subtitleName") {// 选中字幕_vodPlayerController.selectTrack(tempInfo.trackIndex);} else {// 其它字幕不需要的话, 进行deselectTrack_vodPlayerController.deselectTrack(tempInfo.trackIndex);}}}});// 如果需要,可以监听轨道切换消息_controller.onPlayerEventBroadcast.listen((event) async {if(event["event"] == TXVodPlayEvent.VOD_PLAY_EVT_SELECT_TRACK_COMPLETE) {int trackIndex = event[TXVodPlayEvent.EVT_KEY_SELECT_TRACK_INDEX];int errorCode = event[TXVodPlayEvent.EVT_KEY_SELECT_TRACK_ERROR_CODE];}});
// 开始播放视频后,监听字幕文本内容回调_controller.onPlayerEventBroadcast.listen((event) async {if(event["event"] == TXVodPlayEvent.EVENT_SUBTITLE_DATA) {// 字幕文本内容,可用于显示String subtitleDataStr = event[TXVodPlayEvent.EXTRA_SUBTITLE_DATA] ?? "";}});
// 返回音频轨道信息列表List<TXTrackInfo> trackInfoList = await _vodPlayerController.getAudioTrackInfo();for (TXTrackInfo tempInfo in trackInfoList) {if(tempInfo.trackIndex == 0) {// 通过判断 trackIndex 或者 name 切换到需要的音轨_vodPlayerController.selectTrack(tempInfo.trackIndex);} else {// 不需要的音轨进行 deselectTrack_vodPlayerController.deselectTrack(tempInfo.trackIndex);}}
// 播放视频 A: 如果将 autoPlay 设置为 true, 那么 startVodPlay 调用会立刻开始视频的加载和播放String urlA = "http://1252463788.vod2.myqcloud.com/xxxxx/v.f10.mp4";controller.setAutoPlay(isAutoPlay: true);controller.startVodPlay(urlA);// 在播放视频 A 的同时,预加载视频 B,做法是将 setAutoPlay 设置为 falseString urlB = "http://1252463788.vod2.myqcloud.com/xxxxx/v.f20.mp4";controller.setAutoPlay(isAutoPlay: false);controller.startVodPlay(urlB); // 不会立刻开始播放,而只会开始加载视频
controller.onPlayerEventBroadcast.listen((event) async {//订阅状态变化if(event["event"] == TXVodPlayEvent.PLAY_EVT_PLAY_END) {await _controller_A.stop();await _controller_B.resume();}});
TXVodPlayConfig config = new TXVodPlayConfig();config.setMaxPreloadSize(2); // 预播放最大缓冲大小。单位:MB, 根据业务情况设置去节省流量mVodPlayer.setConfig(config); // 把config 传给 mVodPlayer
FTXVodPlayConfig config = FTXVodPlayConfig();config.maxBufferSize = 10; // 播放时最大缓冲大小。单位:MB_controller.setPlayConfig(config); // 把config 传给 controller
TXPlayerGlobalSetting
是全局缓存设置API,原TXVodConfig
API 已被弃用。TXVodConfig
中的配置。//设置播放引擎的全局缓存目录和缓存大小SuperPlayerPlugin.setGlobalMaxCacheSize(200);// 该缓存路径默认设置到app沙盒目录下,postfixPath只需要传递相对缓存目录即可,不需要传递整个绝对路径。// Android 平台:视频将会缓存到sdcard的Android/data/your-pkg-name/files/testCache 目录。// iOS 平台:视频将会缓存到沙盒的Documents/testCache 目录。SuperPlayerPlugin.setGlobalCacheFolderPath("postfixPath");String palyrl = "http://****";//启动预下载int taskId = await TXVodDownloadController.instance.startPreLoad(palyrl, 3, 1920*1080,onCompleteListener:(int taskId,String url) {print('taskID=${taskId} ,url=${url}');}, onErrorListener: (int taskId, String url, int code, String msg) {print('taskID=${taskId} ,url=${url}, code=${code} , msg=${msg}');});//取消预下载TXVodDownloadController.instance.stopPreLoad(taskId);
//设置播放引擎的全局缓存目录和缓存大小SuperPlayerPlugin.setGlobalMaxCacheSize(200);// 该缓存路径默认设置到app沙盒目录下,postfixPath只需要传递相对缓存目录即可,不需要传递整个绝对路径。// Android 平台:视频将会缓存到sdcard的Android/data/your-pkg-name/files/testCache 目录。// iOS 平台:视频将会缓存到沙盒的Documents/testCache 目录。SuperPlayerPlugin.setGlobalCacheFolderPath("postfixPath");int retTaskId = -1;TXVodDownloadController.instance.startPreload(TXPlayInfoParams(appId: 0, fileId: "your fileId"), 1, 720 * 1080, onStartListener: (taskId, fileId, url, params) { // TXVodDownloadController will call this block for callback taskId and videoInforetTaskId = taskId; }, onCompleteListener: (taskId, url) { // preDownload complete }, onErrorListener: (taskId, url, code, msg) { // preDownload error });//取消预下载TXVodDownloadController.instance.stopPreLoad(retTaskId);
TXVodDownloadController
的视频下载方案实现 HLS 的离线播放。TXVodDownloadController
暂不支持缓存 MP4 和 FLV 格式的文件,仅支持缓存非嵌套 HLS 格式文件。TXVodDownloadController
被设计为单例,因此您不能创建多个下载对象。用法如下:// 该缓存路径默认设置到app沙盒目录下,postfixPath只需要传递相对缓存目录即可,不需要传递整个绝对路径。// Android 平台:视频将会缓存到sdcard的Android/data/your-pkg-name/files/testCache 目录。// iOS 平台:视频将会缓存到沙盒的Documents/testCache 目录。SuperPlayerPlugin.setGlobalCacheFolderPath("postfixPath");
// 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 会选择小于或等于传入分辨率的流进行下载TXVodDownloadMedialnfo medialnfo = TXVodDownloadMedialnfo();TXVodDownloadDataSource dataSource = TXVodDownloadDataSource();dataSource.appId = 1252463788;dataSource.fileId = "4564972819220421305";dataSource.quality = DownloadQuality.QUALITY_480P;dataSource.pSign = "pSignxxxx";medialnfo.dataSource = dataSource;TXVodDownloadController.instance.startDonwload(medialnfo);
TXVodDownloadMedialnfo medialnfo = TXVodDownloadMedialnfo();medialnfo.url = "http://1500005830.vod2.myqcloud.com/43843ec0vodtranscq1500005830/00eb06a88602268011437356984/video_10_0.m3u8";TXVodDownloadController.instance.startDonwload(medialnfo);
TXVodDownloadController.instance.setDownloadObserver((event, info) {}, (errorCode, errorMsg, info) {});
事件 | 说明 |
EVENT_DOWNLOAD_START | 任务开始,表示 SDK 已经开始下载 |
EVENT_DOWNLOAD_PROGRESS | 任务进度,下载过程中,SDK 会频繁回调此接口,您可以通过 mediaInfo.getProgress() 获取当前进度 |
EVENT_DOWNLOAD_STOP | 任务停止,当您调用 stopDownload 停止下载,收到此消息表示停止成功 |
EVENT_DOWNLOAD_FINISH | 下载完成,收到此回调表示已全部下载。此时下载文件可以给 TXVodPlayer 播放 |
TXVodDownloadMedialnfo
对象,您可以访问 URL 或 dataSource 判断下载源,同时还可以获取到下载进度、文件大小等信息。TXVodDownloadController.instance.stopDownload()
方法,参数为开始下载传入的TXVodDownloadMedialnfo
对象。SDK 支持断点续传,当下载目录没有发生改变时,下次下载同一个文件时会从上次停止的地方重新开始。// 获取所有用户的下载列表信息// 接入方可根据下载信息中的userName区分不同用户的下载列表信息List<TXVodDownloadMedialnfo> downloadInfoList = await TXVodDownloadController.instance.getDownloadList();
// 获取某个视频相关下载信息TXVodDownloadMedialnfo downloadInfo = await TXVodDownloadController.instance.getDownloadInfo(medialnfo);int? duration = downloadInfo.duration; // 获取总时长int? playableDuration = downloadInfo.playableDuration; // 获取已下载的可播放时长double? progress = downloadInfo.progress; // 获取下载进度String? playPath = downloadInfo.playPath; // 获取离线播放路径,传给播放器即可离线播放int? downloadState = downloadInfo.downloadState; // 获取下载状态,具体参考STATE_xxx常量
// 删除下载信息bool result = await TXVodDownloadController.instance.deleteDownloadMediaInfo(medialnfo);
// psign 即播放器签名,签名介绍和生成方式参见链接:https://www.tencentcloud.com/document/product/266/42436?from_cn_redirect=1TXPlayInfoParams params = TXPlayInfoParams(appId: 1252463788,fileId: "4564972819220421305", psign: "psignxxxxxxx");_controller.startVodPlayWithParams(params);
FTXVodPlayConfig config = FTXVodPlayConfig();// 如果不配置preferredResolution,则在播放多码率视频的时候优先播放720 * 1280分辨率的码率config.preferredResolution = 720 * 1280;config.enableAccurateSeek = true; // 设置是否精确 seek,默认 trueconfig.progressInterval = 200; // 设置进度回调间隔,单位毫秒config.maxBufferSize = 50; // 最大预加载大小,单位 MB_controller.setPlayConfig(config);
FTXVodPlayConfig config = FTXVodPlayConfig();// 传入参数为视频宽和高的乘积(宽 * 高),可以自定义值传入,默认 720 * 1280config.preferredResolution = 720 * 1280;_controller.setPlayConfig(config);
FTXVodPlayConfig#mediaType
减少播放器 SDK 内部播放类型探测,提升启播速度。FTXVodPlayConfig config = FTXVodPlayConfig();config.mediaType = TXVodPlayEvent.MEDIA_TYPE_FILE_VOD; // 用于提升MP4启播速度config.mediaType = TXVodPlayEvent.MEDIA_TYPE_HLS_VOD; // // 用于提升HLS启播速度_controller.setPlayConfig(config);
FTXVodPlayConfig config = FTXVodPlayConfig();config.progressInterval = 200; // 设置进度回调间隔,单位毫秒_controller.setPlayConfig(config);
TXVodPlayerController
的 onPlayerEventBroadcast
来监听播放器的播放事件,来向您的应用程序同步信息。事件 ID | 数值 | 含义说明 |
PLAY_EVT_PLAY_BEGIN | 2004 | 视频播放开始 |
PLAY_EVT_PLAY_PROGRESS | 2005 | 视频播放进度,会通知当前播放进度、加载进度和总体时长. |
PLAY_EVT_PLAY_LOADING | 2007 | 视频播放 loading,如果能够恢复,之后会有 LOADING_END 事件。 |
PLAY_EVT_VOD_LOADING_END | 2014 | 视频播放 loading 结束,视频继续播放。 |
VOD_PLAY_EVT_SEEK_COMPLETE | 2019 | Seek 完成,10.3版本开始支持。 |
事件 ID | 数值 | 含义说明 |
PLAY_EVT_PLAY_END | 2006 | 视频播放结束 |
PLAY_ERR_NET_DISCONNECT | -2301 | 网络断连,且经多次重连亦不能恢复,更多重试请自行重启播放。 |
PLAY_ERR_HLS_KEY | -2305 | HLS 解密 key 获取失败 |
事件 ID | 数值 | 含义说明 |
PLAY_WARNING_VIDEO_DECODE_FAIL | 2101 | 当前视频帧解码失败 |
PLAY_WARNING_AUDIO_DECODE_FAIL | 2102 | 当前音频帧解码失败 |
PLAY_WARNING_RECONNECT | 2103 | 网络断连,已启动自动重连 (重连超过三次就直接抛送 PLAY_ERR_NET_DISCONNECT 了)。 |
PLAY_WARNING_HW_ACCELERATION_FAIL | 2106 | 硬解启动失败,采用软解。 |
事件 ID | 数值 | 含义说明 |
PLAY_EVT_VOD_PLAY_PREPARED | 2013 | 播放器已准备完成,可以播放。设置了 autoPlay 为 false 之后,需要在收到此事件后,调用 resume 才会开始播放。 |
PLAY_EVT_RCV_FIRST_I_FRAME | 2003 | 网络接收到首个可渲染的视频数据包(IDR) |
VOD_PLAY_EVT_VOD_PLAY_FIRST_VIDEO_PACKET | 2017 | 收到首帧数据包事件, 12.0版本开始支持。 |
事件 ID | 数值 | 含义说明 |
PLAY_EVT_CHANGE_RESOLUTION | 2009 | 视频分辨率改变 |
PLAY_EVT_CHANGE_ROTATION | 2011 | MP4 视频旋转角度 |
事件 ID | 数值 | 含义说明 |
PLAY_EVT_GET_PLAYINFO_SUCC | 2010 | 成功获取播放文件信息 |
TXLiveConstants.PLAY_EVT_GET_PLAYINFO_SUCC
事件后,解析 param 获取视频信息。视频信息 | 含义说明 |
EVT_PLAY_COVER_URL | 视频封面地址 |
EVT_PLAY_URL | 视频播放地址 |
EVT_PLAY_DURATION | 视频时长 |
EVT_TIME | 事件发生时间 |
EVT_UTC_TIME | UTC 时间 |
EVT_DESCRIPTION | 事件说明 |
EVT_PLAY_NAME | 视频名称 |
EVT_IMAGESPRIT_WEBVTTURL | 雪碧图 web vtt 描述文件下载 URL,10.2版本开始支持。 |
EVT_IMAGESPRIT_IMAGEURL_LIST | 雪碧图图片下载URL,10.2版本开始支持。 |
EVT_DRM_TYPE | 加密类型,10.2版本开始支持。 |
_controller.onPlayerEventBroadcast.listen((event) async {if (event["event"] == TXVodPlayEvent.PLAY_EVT_PLAY_BEGIN || event["event"] == TXVodPlayEvent.PLAY_EVT_RCV_FIRST_I_FRAME) {// code ...} else if (event["event"] == TXVodPlayEvent.PLAY_EVT_PLAY_PROGRESS) {// code ...}});
评估参数 | 含义说明 |
NET_STATUS_CPU_USAGE | 当前瞬时 CPU 使用率 |
NET_STATUS_VIDEO_WIDTH | 视频分辨率 - 宽 |
NET_STATUS_VIDEO_HEIGHT | 视频分辨率 - 高 |
NET_STATUS_NET_SPEED | 当前的网络数据接收速度 |
NET_STATUS_VIDEO_FPS | 当前流媒体的视频帧率 |
NET_STATUS_VIDEO_BITRATE | 当前流媒体的视频码率,单位 kbps。 |
NET_STATUS_AUDIO_BITRATE | 当前流媒体的音频码率,单位 kbps。 |
NET_STATUS_VIDEO_CACHE | 缓冲区(jitterbuffer)大小,缓冲区当前长度为0,说明离卡顿就不远了。 |
NET_STATUS_SERVER_IP | 连接的服务器 IP |
_controller.onPlayerNetStatusBroadcast.listen((event) async {int videoWidth = event[TXVodNetEvent.NET_STATUS_VIDEO_WIDTH];});
状态 | 含义 |
paused | 暂停播放 |
failed | 播放失败 |
buffering | 缓冲中 |
playing | 播放中 |
stopped | 停止播放 |
disposed | 控件释放了 |
_controller.onPlayerState.listen((val) { });
SuperPlayerPlugin.instance.onEventBroadcast.listen((event) {int eventCode = event["event"];});
状态 | 值 | 含义 |
EVENT_VOLUME_CHANGED | 1 | 音量发生变化 |
EVENT_AUDIO_FOCUS_PAUSE | 2 | 失去音量输出播放焦点,仅使用 Android。 |
EVENT_AUDIO_FOCUS_PLAY | 3 | 获得音量输出焦点,仅使用 Android。 |
状态 | 值 | 含义 |
EVENT_PIP_MODE_ALREADY_ENTER | 1 | 已经进入画中画模式 |
EVENT_PIP_MODE_ALREADY_EXIT | 2 | 已经退出画中画模式 |
EVENT_PIP_MODE_REQUEST_START | 3 | 开始请求进入画中画模式 |
EVENT_PIP_MODE_UI_STATE_CHANGED | 4 | pip UI 状态发生变动,仅在 Android 31以上生效。 |
EVENT_IOS_PIP_MODE_RESTORE_UI | 5 | 重置UI,仅在 iOS 生效。 |
EVENT_IOS_PIP_MODE_WILL_EXIT | 6 | 将要退出画中画,仅在 iOS 生效。 |
SuperPlayerPlugin.instance.onExtraEventBroadcast.listen((event) {int eventCode = event["event"];});
本页内容是否解决了您的问题?