fplayer—Flutter播放器插件

如何使用 fplayer 插件内置 UI 以及怎样构建自定义视频播放器?

fplayer 是一个 Flutter 插件,用于在移动应用程序中实现视频播放功能。该插件提供了丰富的 API 和可定制的 UI,可以满足不同应用场景的需求。在本文中,我们将介绍如何使用 fplayer 插件及其官网内置 UI 构建一个自定义的视频播放器。

第一步:安装 fplayer 插件

首先,我们需要在 Flutter 项目中安装 fplayer 插件。可以通过在项目的 pubspec.yaml 文件中添加以下依赖来完成安装:

dependencies:fplayer: ^1.0.2

然后,在项目目录中运行 flutter pub get 命令来安装插件。

第二步:使用 fplayer 官网内置 UI

fplayer 官网提供了一些内置的 UI 样式,可以直接在项目中使用。以下是一个示例代码,展示如何使用内置 UI 样式来构建视频播放器:

import 'package:flutter/material.dart';
import 'package:fplayer/fplayer.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {return MaterialApp(title: 'fplayer Demo',theme: ThemeData(primaryColor: const Color(0xFF07B9B9),primaryColorDark: const Color(0xFFFFFFFF),primaryColorLight: const Color(0x33000000),textButtonTheme: TextButtonThemeData(style: ButtonStyle(tapTargetSize: MaterialTapTargetSize.shrinkWrap,overlayColor: MaterialStateProperty.all(Colors.transparent),),),),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {final FPlayer player = FPlayer();// 视频列表List<VideoItem> videoList = [VideoItem(title: '第一集',subTitle: '视频1副标题',url: '<http://player.alicdn.com/video/aliyunmedia.mp4>',),VideoItem(title: '第二集',subTitle: '视频2副标题',url: '<https://www.runoob.com/try/demo_source/mov_bbb.mp4>',),VideoItem(title: '第三集',subTitle: '视频3副标题',url: '<http://player.alicdn.com/video/aliyunmedia.mp4>',),];// 视频索引,单个视频可不传int videoIndex = 0;// 播放传入的urlFuture<void> setVideoUrl(String url) async {try {await player.setDataSource(url, autoPlay: true, showCover: true);} catch (error) {print("播放-异常: $error");return;}}@overridevoid initState() {super.initState();setVideoUrl(videoList[videoIndex].url);}@overridevoid dispose() {super.dispose();player.release();}@overrideWidget build(BuildContext context) {MediaQueryData mediaQueryData = MediaQuery.of(context);Size size = mediaQueryData.size;double videoHeight = size.width * 9 / 16;return Scaffold(appBar: AppBar(// Here we take the value from the MyHomePage object that was created by// the App.build method, and use it to set our appbar title.title: Text(widget.title),),body: Column(children: [FView(player: player,width: double.infinity,height: videoHeight, // 需自行设置,此处宽度/高度=16/9color: Colors.black,fsFit: FFit.contain, // 全屏模式下的填充fit: FFit.fill, // 正常模式下的填充panelBuilder: fPanelBuilder(// 视频列表开关videos: true,// 视频列表列表videoMap: videoList,// 当前视频索引videoIndex: videoIndex,// 播放下一集视频回调playNextVideoFun: () {setState(() {videoIndex += 1;});},// 视频播放错误点击刷新回调onVideoEnd: () async {// 视频结束最后一集的时候会有个UI层显示出来可以触发重新开始var index = videoIndex + 1;if (index < videoList.length) {await player.reset();setState(() {videoIndex = index;});setVideoUrl(videoList[index].url);}},),),// 自定义小屏列表Container(width: double.infinity,height: 30,margin: const EdgeInsets.all(20),child: ListView.builder(scrollDirection: Axis.horizontal,padding: EdgeInsets.zero,itemCount: videoList.length,itemBuilder: (context, index) {bool isCurrent = videoIndex == index;Color textColor = Theme.of(context).primaryColor;Color bgColor = Theme.of(context).primaryColorDark;Color borderColor = Theme.of(context).primaryColor;if (isCurrent) {textColor = Theme.of(context).primaryColorDark;bgColor = Theme.of(context).primaryColor;borderColor = Theme.of(context).primaryColor;}return GestureDetector(onTap: () async {await player.reset();setState(() {videoIndex = index;});setVideoUrl(videoList[index].url);},child: Container(margin: EdgeInsets.only(left: index == 0 ? 0 : 10),padding: const EdgeInsets.symmetric(horizontal: 5),decoration: BoxDecoration(borderRadius: BorderRadius.circular(5),color: bgColor,border: Border.all(width: 1.5,color: borderColor,),),alignment: Alignment.center,child: Text(videoList[index].title,style: TextStyle(fontSize: 15,color: textColor,),),),);},),),],),);}
}

在上述代码中,我们使用 FView 组件来构建一个视频播放器,其中 fPanelBuilder 参数为内置UI组件,下面是对组件内的参数介绍:

属性:

属性名 类型 描述
title String 单视频模式视频标题
subTitle String 单视频模式视频副标题
isSnapShot bool 是否显示截图按钮,默认为false
isRightButton bool 是否显示全屏模式中间区域右上方按钮组,默认为false
rightButtonList List<Widget> 全屏模式中间区域右上方按钮组,建议不要超过三个
isVideos bool 是否为多视频模式,默认为false
videoList List<VideoItem> 多视频列表
speedList List<Map> 倍速列表
isResolution bool 是否显示清晰度按钮,默认为false
resolutionList List<ResolutionItem> 清晰度列表

方法:

方法名 描述
playNextVideoFun 多视频模式全屏状态下点击播放下一集按钮事件
settingFun 点击右上角设置按钮事件
onError 视频播放错误点击刷新回调
onVideoEnd 视频播放完成回调
onVideoTimeChange 视频事件变动则触发一次,可以保存视频播放历史
onVideoPrepared 视频初始化完毕回调,如有历史记录时间段则可以触发快进

第三步:自定义 fplayer 样式

如果您不希望使用内置 UI 样式,也可以自定义 fplayer 样式。以下是一个示例代码,展示如何自定义样式:

class CustomFPanel extends StatefulWidget {final FPlayer player;final BuildContext buildContext;final Size viewSize;final Rect texturePos;const CustomFPanel({@required this.player,this.buildContext,this.viewSize,this.texturePos,});@override_CustomFPanelState createState() => _CustomFPanelState();
}class _CustomFPanelState extends State<CustomFPanel> {FPlayer get player => widget.player;bool _playing = false;@overridevoid initState() {super.initState();widget.player.addListener(_playerValueChanged);}void _playerValueChanged() {FValue value = player.value;bool playing = (value.state == FState.started);if (playing != _playing) {setState(() {_playing = playing;});}}@overrideWidget build(BuildContext context) {Rect rect = Rect.fromLTRB(max(0.0, widget.texturePos.left),max(0.0, widget.texturePos.top),min(widget.viewSize.width, widget.texturePos.right),min(widget.viewSize.height, widget.texturePos.bottom),);return Positioned.fromRect(rect: rect,child: Container(alignment: Alignment.bottomLeft,child: IconButton(icon: Icon(_playing ? Icons.pause : Icons.play_arrow,color: Colors.white,),onPressed: () {_playing ? widget.player.pause() : widget.player.start();},),),);}@overridevoid dispose() {super.dispose();player.removeListener(_playerValueChanged);}
}

在上述代码中,我们创建了CustomFPanel组件,接下来只需要把这个组件传入Fview的panelBuilder参数,一个简单的自定义皮肤就实现了。

FView(player: player,panelBuilder: (FPlayer player,FData data,BuildContext context,Size viewSize,Rect texturePos,) {return CustomFPanel(player: player,buildContext: context,viewSize: viewSize,texturePos: texturePos,);},
)

结论

在本文中,我们介绍了如何使用 fplayer 插件及其官网内置 UI 以及构建自定义的视频播放器。无论您是想使用内置样式还是自定义样式,fplayer 都提供了丰富的 API 和可定制的 UI,可以满足不同应用场景的需求。如果您正在开发一款移动应用程序并需要视频播放功能,fplayer 可以是一个不错的选择。更多关于fplayer的内容请查看fplayer官网。

fplayer—Flutter播放器插件相关推荐

  1. Flutter 播放器插件

    Flutter主流视频播放器分析: 概述 播放器是指能读取.解析.渲染 存储在 本地 或者 服务器 上的音视频文件的软件,播放器的主要职责: 下载与缓冲.缓存 解码 渲染 播放UI 功能丰富的播放器还 ...

  2. 小型音乐播放器插件APlayer.js的简单使用例子

      本篇博客将会给出一个小型音乐播放器插件APlayer.js的使用例子.关于APlayer.js的具体介绍和Github地址,可以参考: https://github.com/MoePlayer/. ...

  3. js插件---10个免费开源的JS音乐播放器插件

    js插件---10个免费开源的JS音乐播放器插件 一.总结 一句话总结:各种插件都有很多,多去找. 二.js插件---10个免费开源的JS音乐播放器插件 亲测可用 音乐播放器在网页设计中有时候会用到, ...

  4. mplayer-php,jQuery MPlayer网站音乐播放器插件

    jQuery MPlayer网站音乐播放器插件 这是一款2017年贺新春版的红色喜庆音乐播放器代码,jQuery MPlayer网站音乐播放器插件下载. 注意:演示效果在左下角收起来了,别以为没演示! ...

  5. zblog音频MP3播放器插件

    简介: zblog音频MP3播放器插件在主题管理中上传并启用 一款网页音频播放器,支持上传MP3或第三方MP3外链地址. 使用说明:将zba插件在zblog后台程序上传后,启用插件 网盘下载地址: h ...

  6. Html5添加audio音频播放器插件教程

    2019独角兽企业重金招聘Python工程师标准>>> 一.方法: 使用Material design风格音频播放器插件需要引入jQuery和jaudio.min.js. <s ...

  7. php项目网页音乐播放器插件,10个免费开源的JS音乐播放器插件

    10个免费开源的JS音乐播放器插件 三月 24, 2015 评论 (3) Sponsor 音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些网页播放器插件比较少见,所以这里 ...

  8. 非常简洁的vsPlayAudio在线音乐播放器插件

    非常简洁的vsPlayAudio在线音乐播放器插件. 简介 1.暂时只支持网易云音乐之后添加本地音频 2.暂时不支持手机端(未测试) 3.版本初期可能会有BUG 使用方法 <head> & ...

  9. jwplayer html插件,jw player(网页媒体播放器插件) v2017 最新版

    软件标签: jwplayer flash插件 播放器插件 jwplayer是一款功能十分强大的网页播放器,安装此插件后,用户可以使用网页观看各种格式视频,功能有些类似于flash,不过支持的视频格式更 ...

最新文章

  1. Oracle 中count(1) 和count(*) 的区别
  2. C++ primer 笔记 (一)
  3. LiveVideoStack线上分享第四季(三):在线教育的音视频架构设计及弱网对抗技术...
  4. CAN总线很难吗?CAN总线看不懂是不可能的!
  5. 通信原理 —— 绪论
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的家校通管理系统
  7. AngularJS学习之旅—AngularJS 事件(十四)
  8. JVM 怎么判断对象已经死了?
  9. mysql更新记录_如何查看 mysql 表中最近更新的记录
  10. 新梦想干货——软件测试中的43个功能测试点(下)
  11. 影像篡改与识别(三):人工智能时代
  12. 批量删除html 超链接,Excel中批量删除超链接的方法
  13. 阿里笔试 3.14 T1
  14. 中职计算机应用和平面设计,中等职业教育十一五规划教材·中职中专计算机类教材系列·Photoshop平面设计与实训...
  15. SBC音频编解码算法在无线音频传输上的简单应用
  16. 关于SpringData JPA 查询数据id全部为0的原因
  17. Elixir 学习笔记
  18. 【zzq‘笔记】HDR成像技术学习(一)
  19. python 爬虫(cookie)
  20. Python意想不到的新功能

热门文章

  1. Python入门技能树-程序设计思想:练习题个人总结
  2. 怎么人像抠图?这几种抠图方法一看就会
  3. Flink教程(17)- Flink Table与SQL(案例与SQL算子)
  4. 大屏展示LCD液晶字体—css3 @font-face属性自定义字体
  5. AD设计PCB从入门到精通(学习思路总结)
  6. 易语言视频教程(黑旋易语言教程)一套
  7. 注意力机制详解系列(二):通道注意力机制
  8. 网络云存储技术Windows server 2012 (项目十九 iSCSI磁盘的在线扩容)
  9. 软件目录【20年7月】
  10. 下载redhat4.8的方法