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对象保存到文件系统或数据库中,需要采用序列化的…...
博物馆展览门户|基于springboot + vue博物馆展览门户系统(源码+数据库+文档)
博物馆展览门户系统 目录 基于springboot vue博物馆展览门户系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue博物馆展览门户系统 一、前言 博主…...
YimMenu创新安全框架:GTA5游戏增强与防护指南
YimMenu创新安全框架:GTA5游戏增强与防护指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
VoxCPM-1.5-WEBUI作品集:高音质语音合成效果大赏
VoxCPM-1.5-WEBUI作品集:高音质语音合成效果大赏 1. 开篇:声音的艺术与技术 在数字内容创作领域,声音质量往往决定了作品的沉浸感和专业度。想象一下,当你听到一段清晰自然、富有情感的语音时,是否会不自觉地被吸引&…...
银河麒麟系统下VSCode安装全攻略:从下载到桌面图标配置(附QT开发环境搭建)
银河麒麟系统下VSCode与QT开发环境深度配置指南 在国产操作系统逐渐普及的今天,银河麒麟作为一款基于Linux的国产操作系统,正受到越来越多开发者的关注。对于习惯使用VSCode进行开发的程序员来说,如何在银河麒麟系统上高效配置开发环境成为一…...
NSGA-Ⅲ实战:在TensorFlow/PyTorch模型超参数调优中应用多目标优化
NSGA-Ⅲ实战:在TensorFlow/PyTorch模型超参数调优中应用多目标优化 当你在训练一个图像分类模型时,是否经常陷入这样的困境:模型准确率提高2%,但推理速度却慢了50%?或者模型压缩后体积减小了60%,但准确率骤…...
Blender 3MF插件:3D打印工作流的革命性升级方案
Blender 3MF插件:3D打印工作流的革命性升级方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印领域,设计师们长期面临一个核心痛点&…...
开源字体工具FontForge:从设计新手到专业创作者的全流程指南
开源字体工具FontForge:从设计新手到专业创作者的全流程指南 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 你是否曾为找不到匹配项目风格的字体而苦恼&…...
新手入门:借助快马轻松构建你的第一个抖音更新分析应用
最近在学习抖音生态开发,发现版本更新分析是个挺有意思的切入点。作为新手,我尝试用InsCode(快马)平台搭建了一个简单的分析工具,整个过程比想象中顺利很多。这里记录下我的实践过程,希望能帮到同样刚入门的朋友。 项目构思 抖音每…...
Spring Boot服务半夜OOM?别慌!手把手教你用jmap和VisualVM 2.0.7分析dump文件定位Bug
Spring Boot服务半夜OOM?别慌!手把手教你用jmap和VisualVM 2.0.7分析dump文件定位Bug 凌晨三点,监控系统突然报警——某Spring Cloud微服务节点内存占用突破阈值。作为值班工程师,你需要在最短时间内定位问题根源。本文将带你体验…...
别再手动算脉冲了!用STM32的TIM编码器接口实现AB相编码器测速(附四倍频配置)
STM32硬件编码器接口实战:四倍频测速与电机控制优化 在嵌入式运动控制系统中,编码器测速的精度和实时性直接影响整个系统的性能表现。传统的中断计数方式虽然直观,但存在CPU占用率高、响应延迟等问题。而STM32系列微控制器内置的硬件编码器接…...
