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
英文地址,請注明出處:http://en.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 到數…