Flutter_学习记录_video_player、chewie 播放视频

devtools/2025/3/17 3:02:58/

1. video_player 视频播放

插件地址:https://pub.dev/packages/video_player

  1. 添加插件
    在这里插入图片描述
  2. 导入头文件
import 'package:video_player/video_player.dart';
  1. Android配置(iOS不用配置)

修改这个文件:/android/app/src/main/AndroidManifest.xml;
添加下面的配置:

<uses-permission android:name="android.permission.INTERNET"/>
  1. 添加核心代码

初始化播放器:

Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);_videoPlayerController.initialize().then((_){print("播放器初始化完成");// 添加播放器的监听_videoPlayerController.addListener(_onVideoChange);// 设置自动播放_videoPlayerController.play();_isPlaying = true;setState(() {print("111111");});});

添加播放器的视图:

return VideoPlayer(_videoPlayerController);

退出页面时,需要销毁播放器:

 void dispose() {_videoPlayerController.dispose();super.dispose();}
  1. 完整代码
import 'dart:async';import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';class VideoPlayerDemo extends StatefulWidget {const VideoPlayerDemo({super.key});State<VideoPlayerDemo> createState() => _VideoPlayerDemoState();
}class _VideoPlayerDemoState extends State<VideoPlayerDemo> {late VideoPlayerController _videoPlayerController;bool _isPlaying = false;double _progress = 0.0;// 添加播放状态的订阅,避免每次调用setState 重刷页面late StreamController _isPlayingController;// 添加播放进度的订阅,避免每次调用setState 重刷页面late StreamController _progressController;void initState() {super.initState();_isPlayingController = StreamController.broadcast();_progressController = StreamController.broadcast();Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);_videoPlayerController.initialize().then((_){print("播放器初始化完成");// 添加播放器的监听_videoPlayerController.addListener(_onVideoChange);// 设置自动播放_videoPlayerController.play();_isPlaying = true;setState(() {});});}void dispose() {_videoPlayerController.dispose();_isPlayingController.close();_progressController.close();super.dispose();}// 自定义播放器的监听回调的方法void _onVideoChange() {print("播放器的监听回调");if (_videoPlayerController.value.isInitialized) {final isPlaying = _videoPlayerController.value.isPlaying;if (isPlaying != _isPlaying) {_isPlaying = isPlaying;_isPlayingController.sink.add(_isPlaying);}// 更新播放进度final position = _videoPlayerController.value.position;final duration = _videoPlayerController.value.duration;if (duration != null) {_progress = position.inMilliseconds / duration.inMilliseconds;print("进度 = $_progress");_progressController.sink.add(_progress);}// 检查视频是否播放完毕if (position >= duration) {print('Video has completed playing.');_videoPlayerController.seekTo(Duration.zero); // 重置到开始位置_videoPlayerController.pause(); // 暂停播放_isPlaying = false;_isPlayingController.add(_isPlaying);}}}// 播放器的视图Widget _palyerViewWidget() {if (_videoPlayerController.value.isInitialized) {// 初始化成功return AspectRatio(aspectRatio: _videoPlayerController.value.aspectRatio,child: Stack(children: [// 播放器VideoPlayer(_videoPlayerController),// 添加进度条Align(alignment: Alignment.bottomCenter,child: _progressWidget(),)],));} else {// loading视图return CircularProgressIndicator();}}// 进度条Widget _progressWidget() {// 进度条变化比较频繁:用 StreamBuilder 减少内存的消耗return  StreamBuilder(stream: _progressController.stream, builder: (context, snapshot) {print("更新进度条");return SizedBox(height: 35,child: Slider(value: _progress,onChanged: (value) {print("onChanged");setState(() {_videoPlayerController.seekTo(Duration(milliseconds: (value * _videoPlayerController.value.duration.inMilliseconds).round()));});},),);});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Video_Player_demo"),),body: Center(child: _palyerViewWidget(),),floatingActionButton: FloatingActionButton(onPressed: (){if (_isPlaying) {// 正在播放_videoPlayerController.pause();_isPlaying = false;} else {_videoPlayerController.play();_isPlaying = true;}_isPlayingController.add(_isPlaying);},// 这个按钮变化比较频繁:用 StreamBuilder 减少内存的消耗child: StreamBuilder(stream: _isPlayingController.stream, builder: (context, snapshot) {return Icon(_isPlaying ? Icons.pause : Icons.play_arrow);}),),);}
}
  1. 效果图如下:
    在这里插入图片描述

2. chewie 播放视频

在 Flutter 里官方提供了一个 video_player插件可以播放视频,但video_player有一些局限性:没法控制底部播放进度等。
所以可以用另外一个三方的视频播放库chewie
chewie是一个非官方的第三方视频播放组件,看起来好像是基于 HTML5 播放的组件。
chewie 相对 video_player 来说,有控制栏和全屏的功能
Chewie 使用 video_player 引擎并将其包裹在友好的 Material 或 Cupertino UI中!

插件地址:https://pub.dev/packages/chewie

  1. 引入插件
    chewie基于video_player,所以要使用chewie必须配置video_player
    在这里插入图片描述
  2. 导入头文件
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
  1. Android配置(iOS不用配置)

修改这个文件:/android/app/src/main/AndroidManifest.xml;
添加下面的配置:

<uses-permission android:name="android.permission.INTERNET"/>
  1. 核心代码
import 'package:chewie/chewie.dart';
import 'package:video_player/video_player.dart';final videoPlayerController = VideoPlayerController.networkUrl(Uri.parse('https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4'));await videoPlayerController.initialize();final chewieController = ChewieController(videoPlayerController: videoPlayerController,autoPlay: true,looping: true,
);final playerWidget = Chewie(controller: chewieController,
);

退出页面时,需要销毁播放器:

 void dispose() {_videoPlayerController.dispose();_chewieController.dispose();super.dispose();}
  1. 完整代码
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';class ChewieDemo extends StatefulWidget {const ChewieDemo({super.key});State<ChewieDemo> createState() => _ChewieDemoState();
}class _ChewieDemoState extends State<ChewieDemo> {late VideoPlayerController _videoPlayerController;late ChewieController _chewieController;void initState() {super.initState();// 初始化播放器_initVideo();}void dispose() {_videoPlayerController.dispose();_chewieController.dispose();super.dispose();}// 初始化播放器void _initVideo() async {Uri url = Uri.parse("https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4");_videoPlayerController = VideoPlayerController.networkUrl(url);await _videoPlayerController.initialize();_chewieController = ChewieController(videoPlayerController: _videoPlayerController,aspectRatio: _videoPlayerController.value.aspectRatio,autoPlay: true,looping: false);setState(() {});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Chewie demo-在线播放视频"),),body: Center(child: _videoPlayerController.value.isInitialized ? AspectRatio(aspectRatio: _videoPlayerController.value.aspectRatio,child: Chewie(controller: _chewieController),) : CircularProgressIndicator(),),);}
}
  1. 效果图:
    在这里插入图片描述

http://www.ppmy.cn/devtools/167717.html

相关文章

RabbitMQ入门:从安装到高级消息模式

文章目录 一. RabbitMQ概述1.1 同步/异步1.1.1 同步调用1.1.2 异步调用 1.2 消息中间件1.2.1 概念1.2.2 作用1.2.3 常见的消息中间件1.2.4 其他中间件 1.3 RabbitMQ1.3.1 简介1.3.2 特点1.3.3 方式1.3.4 架构1.3.5 运行流程 二. 安装2.1 Docker 安装 RabbitMQ 三. 简单队列&…

【技术分享】Linux常见日志解析(一)

本文关键词&#xff1a;电子数据取证、电子取证、计算机取证工具 前言&#xff1a; 日志数据可以是有价值的信息宝库&#xff0c;也可以是毫无价值的数据泥潭。它可以记录下系统所产生的所有行为&#xff0c;并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统…

中科院自动化所人形机器人研究进展:全面综述与展望

作者&#xff1a;Yuchuang Tong, Haotian Liu, and Zhengtao Zhang 单位&#xff1a;中国科学院自动化研究所&#xff0c;中国科学院大学人工智能学院 论文标题&#xff1a;Advancements in Humanoid Robots: A Comprehensive Review and Future Prospects 出版信息&#xf…

剑指 Offer II 080. 含有 k 个元素的组合

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20080.%20%E5%90%AB%E6%9C%89%20k%20%E4%B8%AA%E5%85%83%E7%B4%A0%E7%9A%84%E7%BB%84%E5%90%88/README.md 剑指 Offer II 080. 含有 k 个元素的组合 题目描述 给…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…

Linux 找回 Root 密码(多发行版本)

适用于大多数 Linux 发行版&#xff08;Ubuntu、CentOS、Debian 等&#xff09;&#xff0c;无需第三方工具&#xff0c;需物理接触服务器或系统启动权限。 步骤 1&#xff1a;重启系统并进入 GRUB 引导菜单 重启系统&#xff0c;看到启动画面时&#xff0c;快速按下 Esc、Shi…

AI辅助编程!DeepSeek vs ChatGPT- AI在地图网络分析(最佳路径)上的应用

你是否好奇像DeepSeek和ChatGPT这样的AI语言模型在生成创建网络地图的Python代码时表现如何&#xff1f;在本教程中&#xff0c;我将对它们进行测试&#xff01; 仅需一个简单提示&#xff0c;这些大语言模型就能生成代码&#xff1a;接收一个起点和多个目的地地址&#xff0c;…

prometheus-helm的使用

1、部署Prometheus监控平台 1、下载安装Prometheus &#xff08;当前集群版本1.26.3&#xff09; git clone https://github.com/prometheus-operator/kube-prometheus.git -b release-0.12 安装&#xff1a; cd kube-prometheus/ 创建命名空间和crd&#xff1a; kubectl …