当前位置: 首页 > news >正文

flutter封装vlcplayer的控制器

import 'dart:async';import 'package:flutter_vlc_player/flutter_vlc_player.dart';
import 'package:flutter/material.dart';class GlobalVlcController extends ChangeNotifier {//设置单例/*static final GlobalVlcController _instance = GlobalVlcController._internal();factory GlobalVlcController() => _instance;GlobalVlcController._internal();*/late VlcPlayerController _controller;String? _currentUrl;bool _isInitialized = false;VlcPlayerController get controller => _controller;bool get isInitialized => _isInitialized;VoidCallback? _onInitListener;bool isSetLoop = false;//初始化控制器Future<void> initialize({String? url}) async {print('视频播放器初始化==========$_isInitialized');if (_isInitialized) {if (_currentUrl != url && url != null && url.isNotEmpty) {await setDataSource(url);}return;}_doInit(url);}/** 这个方法自带初始化无需再调用initialized()* 控制器虽然初始化完成但是元数据还未解析完成。* _controller.value.isInitialized为true,但是获取视频宽高时可能获取不到。* 可以使用轮询Timer.periodic()去获取,获取到后取消轮询[可看获取 宽、高示例]* */_doInit(String? url){_controller = VlcPlayerController.network(url?? '',autoPlay: false,options: VlcPlayerOptions(advanced: VlcAdvancedOptions([VlcAdvancedOptions.networkCaching(200),]),rtp: VlcRtpOptions([VlcRtpOptions.rtpOverRtsp(true),]),http: VlcHttpOptions([VlcHttpOptions.httpReconnect(true),]),));_currentUrl = url;_isInitialized = true;notifyListeners();}//设置播放资源Future<void> setDataSource(String url) async {if (_currentUrl == url) return;_currentUrl = url;await _controller.stop();await _controller.setMediaFromNetwork(url);notifyListeners();}//播放Future<void> play() async {await _controller.play();}//暂停Future<void> pause() async {await _controller.pause();}//初始化监听-只会调用一次Future<void> addOnInitListener(VoidCallback listener) async {if (_isInitialized) {_onInitListener = listener;_controller.addOnInitListener(_onInitListener!);}}//添加监听addListener(VoidCallback listener) {if(_isInitialized){_controller.addListener(listener);}}//移除监听removeListener(VoidCallback listener){if(_isInitialized){_controller.removeListener(listener);}}//设置循环播放-vlcPlayer设置循环播放失效,以这种方式失效循环播放addLoopListener(){if(_isInitialized){_controller.addListener(loopListener);}}loopListener(){if (_controller.value.playingState == PlayingState.ended) {_controller.stop().then((_){_controller.setVolume(0);_controller.play();isSetLoop = true;notifyListeners();print('isSetLoop===== $isSetLoop');});}}//销毁控制器Future<void> disposeController() async {print('=播放器销毁释放===');try {if (_isInitialized && controller.value.isInitialized) {if(_onInitListener != null){_controller.removeOnInitListener(_onInitListener!);}if(isSetLoop == true){_controller.removeListener(loopListener);isSetLoop = false;}if(_controller.value.isInitialized == true){/*if(_controller.value.isPlaying){_controller.pause();}*/await _controller.stop();await _controller.dispose().then((_){_isInitialized = false;_currentUrl = null;notifyListeners();});}}}catch(e){print('销毁出错:${e}');}}/** 获取宽、高示例* */getVideoSizeInfo() async {if (_isInitialized && _controller.value.isInitialized) {int _attempt = 0;Timer.periodic(Duration(milliseconds: 300), (timer) {final _size = _controller.value.size;if (_size.width > 0 && _size.height > 0) {timer.cancel(); // 宽高有值了,停止轮询print('width===== ${_size.width}');print('height===== ${_size.height}');}else if(_attempt>= 200){//1分钟后还未获取到停止轮询timer.cancel();}});}}}

引用

GlobalVlcController _glc = GlobalVlcController();
///....对_glc的一系列引用
http://www.dtcms.com/a/266388.html

相关文章:

  • 如何使用DeepSeek一键生成系统架构图?
  • 如何将大型视频文件从 iPhone 传输到 PC
  • 怎么更改cursor字体大小
  • 10分钟搭建 PHP 开发环境教程
  • VSCode 安装使用教程
  • SQL Server 进阶语法实战:从动态透视到存储过程的深度应用(第四课)
  • 高功率的照明LN2系列助力电子元件薄膜片检测
  • 推荐算法系统系列>推荐数据仓库集市的ETL数据处理
  • GaussDB权限管理:从RBAC到精细化控制的企业级安全实践
  • 设计模式(十)
  • [学习记录]Unity毛发渲染[URP]-Fin基础版
  • Django Channels WebSocket实时通信实战:从聊天功能到消息推送
  • Linux入门篇学习——Linux 帮助手册
  • 八、测试与调试
  • 万勋科技「柔韧机器人玻璃幕墙清洗」全国巡展@上海!引领清洗无人机智能化升级
  • Rovo Dev CLI Windows 安装与使用指南
  • 暑期数据结构第一天
  • CLIP的tokenizer详解
  • 2-jdk8环境下安装Kafka
  • 标签体系设计与管理:从理论基础到智能化实践的综合指南
  • chrome安装AXURE插件后无效
  • uniapp 微信小程序水印
  • c++游戏_小恐龙(开源)
  • Spring Boot + MyBatis/MyBatis Plus:XML中循环处理List参数的终极指南
  • MySQL安装报错解决
  • 解锁阿里云Hologres:开启实时数据分析新时代
  • [论文阅读] 人工智能 + 软件工程 | 需求获取访谈中LLM生成跟进问题研究:来龙去脉与创新突破
  • ODS 系统是什么?企业为什么需要搭建 ODS?
  • .net对象映射框架
  • Response对象