flutter封装vlcplayer的控制器

dart 复制代码
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();
        }
      });
    }
  }

}

引用

dart 复制代码
GlobalVlcController _glc = GlobalVlcController();
///....对_glc的一系列引用
相关推荐
sanx1810 分钟前
一站式电竞平台解决方案:数据、直播、源码,助力业务飞速启航
前端·数据库·apache·数据库开发·时序数据库
余防17 分钟前
存储型XSS,反射型xss
前端·安全·web安全·网络安全·xss
ObjectX前端实验室31 分钟前
从零到一:系统化掌握大模型应用开发【目录】
前端·llm·agent
guoyp212638 分钟前
前端实验(二)模板语法
前端·vue.js
葡萄城技术团队44 分钟前
Excel 转在线协作难题破解:SpreadJS 纯前端表格控件的技术方案与实践
前端·excel
我的xiaodoujiao44 分钟前
Windows系统Web UI自动化测试学习系列3--浏览器驱动下载使用
前端·windows·测试工具·ui
一只小风华~1 小时前
学习笔记:Vue Router 中的嵌套路由详解[特殊字符]概述
前端·javascript·vue.js
泻水置平地1 小时前
若依前后端分离版实现前端国际化步骤
前端
Villiam_AY1 小时前
从后端到react框架
前端·react.js·前端框架
CodeCraft Studio1 小时前
全球知名的Java Web开发平台Vaadin上线慧都网
java·开发语言·前端·vaadin·java开发框架·java全栈开发·java ui 框架