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.pswp.cn/news/913006.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO-滥用元机器人、规范或 hreflang 标签

&#x1f9f1; 一、滥用 Meta Robots 标签 ❌ 常见问题&#xff1a; 问题描述设置了 noindex 不该屏蔽的页面比如产品页、分类页被意外 noindex&#xff0c;导致不被收录设置 nofollow 导致内链失效所有链接都被 nofollow&#xff0c;影响爬虫抓取路径在 <meta> 标签和…

笨方法学python -练习14

程序&#xff1a; from sys import argv script, user_name argv prompt > print(f"Hi {user_name}, Im the {script} script.") print("Id like to ask you a few questions.") print(f"Do you like me {user_name}?") likes in…

Frida:配置自动补全 in VSCode

1. 前言 编写 frida JavaScript 脚本是一件 very 普遍的事情在 Android Reverse 中。为了方便编写&#xff0c;配置相关的环境使其能够自动补全是很关键的&#xff0c;即通过类名就能够获取该类的所有对外接口信息&#xff0c;这是面向对象编程的核心优势&#xff0c;可惜我没…

FPGA矩阵算法实现

简介 现如今设计上对速度的要求越来越高&#xff0c;而矩阵相乘含有大量的乘法和加法计算&#xff0c;造成计算时间长从而影响性能&#xff0c;本章节利用FPGA实现浮点型矩阵运算&#xff0c;可在极短时间内完成矩阵运算。 知识介绍 矩阵计算公式如下&#xff1a; 需要保证A的…

C#可空类型详解:从基础到高级应用

C#可空类型详解&#xff1a;从基础到高级应用 在C#编程中&#xff0c;可空类型是一个非常重要的概念&#xff0c;它允许我们为值类型&#xff08;如int、bool、DateTime等&#xff09;分配null值&#xff0c;从而增强了代码的表达能力和灵活性。本文将详细介绍C#中可空类型的各…

Elasticsearch:异常检测入门

在我之前的文章里&#xff0c;我有讲述很多有关使用机器学习来针对数据做异常监测的文章。你可以在 “开发者上手指南” 里的 “机器学习” 章节中找到。在今天的练习中&#xff0c;我将使用最新的 Elastic Stack 9.0.2 来展示如何在 Elasticsearch 中使用机器学习的方法来进行…

ARuler3.1.3 | 高级版测量应用,利用AR技术测量所有

ARuler是一款非常便捷的测量应用程序&#xff0c;专为需要精确测量的用户设计。它不仅具备强大的3D测量功能&#xff0c;还利用增强现实&#xff08;AR&#xff09;技术&#xff0c;为用户提供多种测量选项&#xff0c;包括角度、长度、宽度、高度、面积和体积等。无论是日常生…

MapReduce分布式计算框架:从原理到实战

大家好&#xff01;今天我们来聊聊大数据处理领域的一个重要框架——MapReduce。作为Google提出的经典分布式计算模型&#xff0c;MapReduce极大地简化了海量数据的处理流程。无论你是大数据新手还是有一定经验的开发者&#xff0c;这篇文章都会让你对MapReduce有更深入的理解。…

Redis 7 及更高版本的脚本化方案

一、背景与动机 传统的 Redis 脚本机制依赖于客户端加载 EVAL 脚本&#xff0c;存在以下局限&#xff1a; 网络与编译开销 每次调用都要传输脚本源码或重新加载 SHA1。缓存失效风险 重启、主从切换、SCRIPT FLUSH 后脚本缓存丢失&#xff0c;事务易失败。调试与运维困难 SHA1…

Java项目:基于SSM框架实现的云端学习管理系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对课程学习信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

【压力测试之_Jmeter链接Oracle数据库链接】

Oracle数据库链接 欢迎来到挖坑避坑课堂链接数据库 欢迎来到挖坑避坑课堂 之前性能测试都是业务之类的&#xff0c;数据库压测很少涉及&#xff0c;就会出现很多各式各样的问题&#xff0c;首要问题就是Jmeter链接数据库的问题&#xff0c;本篇主要讲解Jmeter链接Oracle数据库…

Appium与Appium Inspector配置教程

一、连接设备 首先将手机的开发者模式打开&#xff0c;不同手机的开启方法不同&#xff0c;这里演示的测试机为vivoS1&#xff0c;其他机型的开启方法大家可以自行AI搜索。 1.手机授权 &#xff08;1&#xff09;点击手机的【设置】选项 &#xff08;2&#xff09;打开手机…

【web出海】深度拆解 FLUX.1 kontext:这不仅是AI绘画的革命,更是 MicroSaaS 创业者的黄金机遇

前言 近日&#xff0c;Black Forest Labs 发布的 FLUX.1 Kontext 模型在AI圈掀起了波澜。它不仅仅是又一个文生图工具&#xff0c;其独特的“在情境中&#xff08;in-context&#xff09;”编辑、惊人的角色一致性、精准的局部修改和强大的文字渲染能力&#xff0c;标志着一个技…

Git 安装闭坑指南(仅 Windows 环境)

&#x1f4bb; Git 安装闭坑指南&#xff08;仅 Windows 环境&#xff09; 适用人群&#xff1a;刚开始用 Git 的 Windows 用户&#xff1b;重新配置开发环境的程序员&#xff1b;不想踩坑的团队小伙伴 目标&#xff1a;快速、稳定地安装 Git&#xff0c;在各种常见场景下避免“…

2025年4月SCI-吕佩尔狐优化算法Rüppell’s fox optimizer-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——吕佩尔狐优化算法Rppell’s fox optimizer&#xff0c;RFO。RFO的灵感来自于吕佩尔狐狸在白天和晚上自然而聪明的集体觅食行为。优化器利用吕佩尔狐敏锐的视觉、听觉和嗅觉对其各种主要觅食活动进行数学模拟&#xff0c;在优化过程中兼顾…

SwiftUI 中的模糊效果详解:.blur、.material、UIVisualEffectView

模糊效果&#xff08;Blur Effect&#xff09;是 iOS 用户界面设计的重要组成部分&#xff0c;它被广泛应用于系统控制中心、通知背景、弹窗蒙版等场景&#xff0c;营造出“毛玻璃”的视觉层次感。 本文将深入解析 SwiftUI 中实现模糊效果的三种主流方式&#xff1a;.blur(radi…

Euler2203安装.NetCore6.0环境操作步骤

# 1. 下载.NET二进制包 wget https://download.visualstudio.microsoft.com/download/pr/xxxx/dotnet-sdk-6.0.xxx-linux-x64.tar.gz把dotnet-sdk-6.0.428-linux-x64.tar.gz放到一个目录里面# 2. 创建安装目录sudo mkdir -p /usr/share/dotnetsudo tar -zxf dotnet-sdk-6.0.428…

解决安装SunloginClient问题记录(Ubuntu 24.04.2)

成功安装流程&#xff08;Ubuntu 24.04.2&#xff09; 1. 首次尝试安装&#xff08;失败&#xff0c;缺少依赖&#xff09; sudo dpkg -i ./SunloginClient_15.2.0.63064_amd64.deb sudo apt-get install -f # 修复依赖&#xff08;此时提示缺少 libgconf-2-4&#xff09; …

wordpress安装教程

一、安装软件 1、apache sudo apt install apache2 -y 2、mysql sudo apt install mysql-server -y 3、PHP及其扩展 sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip php-fpm -y 重启ap…

C#,VB.NET从JSON数据里提取数组中的对象节点值

在VB.NET中&#xff0c;若要从 JSON 数据里提取Data.DataList数组中的CategoryId&#xff0c;并将其转换为VB.NET数组&#xff0c;可借助Json.NET&#xff08;Newtonsoft.Json&#xff09;库来实现。下面为你详细介绍具体的实现步骤和代码示例&#xff1a; 一、实现 JSON 到数…