flutter实现视频播放器,可根据指定视频地址播放、设置声音,进度条拖动,下载等

需要装依赖:
gallery_saver: ^2.3.2video_player: ^2.8.3
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
实现代码
import 'dart:async';
import 'dart:io';import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:path_provider/path_provider.dart';
import 'package:video_player/video_player.dart';
import 'package:http/http.dart' as http;void main() => runApp(const VideoApp());class VideoApp extends StatefulWidget {const VideoApp({super.key});@override_VideoAppState createState() => _VideoAppState();
}class _VideoAppState extends State<VideoApp> {late VideoPlayerController _controller;bool isMuted = false;double _currentSliderValue = 0.0;Timer? _timer;double _playbackSpeed = 1.0;@overridevoid initState() {super.initState();_controller = VideoPlayerController.networkUrl(Uri.parse('你的播放地址'))..initialize().then((_) {setState(() {});});_controller.setLooping(true);_controller.play();_timer = Timer.periodic(Duration(seconds: 1), (Timer timer) {if (_controller.value.isPlaying) {setState(() {_currentSliderValue = _controller.value.position.inMilliseconds.toDouble();});}});}Future<void> downloadAndSaveVideo(String url) async {var httpClient = http.Client();var response = await httpClient.get(Uri.parse(url));var bytes = response.bodyBytes;var tempDir = await getTemporaryDirectory();var tempFile = File('${tempDir.path}/temp_video.mp4');await tempFile.writeAsBytes(bytes);final result = await GallerySaver.saveVideo(tempFile.path);print('Video saved to gallery: $result,path: ${tempFile.path}');}@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Video Demo',home: Scaffold(appBar: AppBar(title: Text('Video Demo'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[_controller.value.isInitialized? AspectRatio(aspectRatio: _controller.value.aspectRatio,child: VideoPlayer(_controller),):const CircularProgressIndicator(),const SizedBox(height: 5),ElevatedButton(onPressed: () {setState(() {isMuted = !isMuted;_controller.setVolume(isMuted ? 0.0 : 1.0);});},child: Text(isMuted ? '静音模式' : '开启声音模式'),),ElevatedButton(onPressed: () {setState(() {if (_controller.value.isPlaying) {_controller.pause();} else {_controller.play();}});},child: Text(_controller.value.isPlaying ? '暂停' : '播放'),),Slider(value: _currentSliderValue,min: 0.0,max: _controller.value.duration.inMilliseconds.toDouble(),onChanged: (double value) {setState(() {_currentSliderValue = value;_controller.seekTo(Duration(milliseconds: value.toInt()));});},),const SizedBox(height: 5),Text('Playback Speed: ${_playbackSpeed.toStringAsFixed(1)}x'),Slider(value: _playbackSpeed,min: 0.5,max: 2.0,divisions: 15,label: '${_playbackSpeed.toStringAsFixed(1)}x',onChanged: (double value) {setState(() {_playbackSpeed = value;_controller.setPlaybackSpeed(_playbackSpeed);});},),ElevatedButton(onPressed: () {downloadAndSaveVideo(_controller.dataSource);},child: Text('下载'),),],),),),);}@overridevoid dispose() {super.dispose();_controller.dispose();_timer?.cancel();}
}
相关文章:
flutter实现视频播放器,可根据指定视频地址播放、设置声音,进度条拖动,下载等
需要装依赖: gallery_saver: ^2.3.2video_player: ^2.8.3 AndroidManifest.xml <uses-permission android:name"android.permission.INTERNET"/> 实现代码 import dart:async; import dart:io;import package:flutter/material.dart; import pa…...
微服务(基础篇-001-介绍、Eureka)
目录 认识微服务(1) 服务架构演变(1.1) 单体架构(1.1.1) 分布式架构(1.1.2) 微服务(1.1.3) 微服务结构 微服务技术对比 企业需求 SpringCloud(1.2) …...
mac 解决随机出现的蓝色框
macbookair为什么打字的时候按空格键会出现蓝色框? - 知乎...
深入理解与使用go之函数与方法--使用
深入理解与使用go之函数与方法–理解与使用 文章目录 引子函数与方法分类函数函数入参普通参数可变参数默认值返回命名不带命名带命名讨论init 函数defer 函数方法值接收指针接收构造函数引子 在 Go 语言中,函数被视为一等公民(First-Class Citizens),这意味着函数可以像其…...
【QT问题】 Qt信号函数如果重名,调用怎么处理
问题描述: 在调用某个类的信号函数的时候,出现信号函数名字相同,参数不同的情况,但是Qt在链接信号槽的时候,又不需要指明信号函数参数,此时就会出现无法分辨的情况。 例如:QComboBox的信号 Q_…...
登山小分队(dfs,模拟)
原题链接: 题目描述 Foxity和他的好友们相约去爬山,但是他们每个人都来到了不同的山脚下。整个山的结构类似一棵 "树",有很多的观光节点通过一条条山道连接起来。 在图论中,树是一种无向图,其中任意两个顶…...
Luminar Neo:重塑图像编辑新纪元,Mac与Win双平台畅享创意之旅
在数字时代的浪潮中,图像编辑软件已成为摄影师和设计师们不可或缺的创作工具。Luminar Neo,作为一款专为Mac与Windows双平台打造的图像编辑软件,正以其卓越的性能和创新的编辑功能,引领着图像编辑的新潮流。 Luminar Neo不仅继承…...
计算机二级Python题库深度解析与备考策略
计算机二级Python题库深度解析与备考策略 随着信息技术的飞速发展,Python作为一门简洁、易读且功能强大的编程语言,受到了越来越多人的青睐。计算机二级Python考试作为衡量考生Python编程水平的重要标准,其题库内容涵盖了Python语言的基础知…...
微信商家转账到零钱:实用指南,涵盖开通、使用与常见问题
商家转账到零钱是什么? 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱,支持批量对外转账,操作便捷。如果你的应用场景是单付款,体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些? 这…...
[精选]Kimi到底是什么,将带来什么?
## 阿里通义千问重磅升级:免费开放1000万字长文档处理功能。 Kimi突然的泼天富贵,大家都想沾一把。短期这一块大概率会继续热一段时间。 作为月之暗面的创始人,杨植麟常把他的AGI梦想形容为“登月计划”,长文本就是这个伟大计划…...
MySQL学习笔记------SQL(2)
ziduanSQL DML 全称为:Data Manipulation Language,用来对数据库中表的数据记录进行增删改操作 插入数据 添加数据(INSERT) 给指定字段添加数据:INSERT INTO 表名(字段名1,字段名2,......…...
【循环神经网络rnn】一篇文章讲透
目录 引言 二、RNN的基本原理 代码事例 三、RNN的优化方法 1 长短期记忆网络(LSTM) 2 门控循环单元(GRU) 四、更多优化方法 1 选择合适的RNN结构 2 使用并行化技术 3 优化超参数 4 使用梯度裁剪 5 使用混合精度训练 …...
KW音乐搜索参数
声明: 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标: …...
SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包
一、后端:在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…...
MySQL 存储引擎
目录 一、存储引擎概念介绍 二、MySQL常用的存储引擎 1、 MyISAM 1.1 MylSAM的特点 1.2 MyISAM 表支持 3 种不同的存储格式: (1)静态(固定长度)表 (2)动态表 (3)压缩表 1.3 MyISAM适用…...
perl:打开文件夹,选择视频文件,并播放
在Windows10系统中Perl安装Tk模块 运行 cmd cpan install Tk 编写 openvideo.pl 如下 #!/usr/bin/perl use strict; use warnings; use File::Basename; use Tk;my $mw MainWindow->new or die cannot create Widget;my $types [[AVI, .avi], [MP4, .mp4]];my $file $…...
分布式链上随机数和keyless account
1. 引言 相关论文见: Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见: https://github.com/aptos-labs/aptos-core(Rust) 在链中生成和集成共享随机数,以扩展应用和强化安全。该…...
【项目设计】基于MVC的负载均衡式的在线OJ
项目代码(可直接下载运行) 一、项目的相关背景 学习编程的小伙伴,大家对力扣、牛客或其他在线编程的网站一定都不陌生,这些编程网站除了提供了在线编程,还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…...
MRC是谁?- 媒体评级委员会 Media Rating Council
在在线广告的世界里,有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说,了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会(MRC)。 1. 了解…...
反序列化漏洞简单知识
目录: 一、概念: 二、反序列化漏洞原因 三、序列化漏洞的魔术方法: 四、反序列化漏洞防御: 一、概念: 序列化: Web服务器将HttpSession对象保存到文件系统或数据库中,需要采用序列化的…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
