flutter播放器_flutter 支持flutter的视频播放器 - CSDN
  • Flutter之播放视频

    2019-12-30 17:39:03
    2、Flutter状态理念认知的巩固 3、AspectRatio的简单使用 本篇博文demo的功能(demo源码点此查看): 1、加载播放视频,并且点击视频区域可以对视频start/pause 2、网络状态发生变化的时候相关处理:当是wifi状态下...

    通过本篇博文你可以了解如下知识点:
    1、VideoPlayerController播放视频的简单使用
    2、Flutter状态理念认知的巩固
    3、AspectRatio的简单使用

    本篇博文demo的功能(demo源码点此查看):
    1、加载播放视频,并且点击视频区域可以对视频start/pause
    2、网络状态发生变化的时候相关处理:当是wifi状态下直接播放视频,当断网的时候暂停视频播放,并且显示一个圆形加载框

    是的,功能很简单,但是着手写这个demo的时候倒是体会到了不少东西。闲言少叙,开车吧。

    项目需要的第三方库需要在pubspec.yaml里面配置:

    在这里插入图片描述

    • VideoPlayerController的简单说明
      VideoPlayerController顾名思义,就是对视频进行播放控制的,它提供了三个视频播放源:从网络播放,从assets文件里面播放,
      从file播放,比如本博文使用的是assets文件里的视频进行播放的,代码如下:
     //通过asset文件进行播放
      VideoPlayerController  controller=VideoPlayerController.asset(
          'videos/butterfly.mp4',
          package: 'flutter_gallery_assets',
        )
    

    如果想要播放网络视频的话就使用network方法:

      static const String beeUri = 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4';
      final VideoPlayerController beeController = VideoPlayerController.network(beeUri);
    

    在播放视频的时候需要先调用initialize()方法初始化,该方法为异步方法,返回一个Future对象。在initialize()调用之前调用play()方法是没法播放的,initialize()初始化完成后会自动播放。 那么完成了initialize之后怎么让视频渲染出来呢?就需要将controller对象交给VideoPlayer(controller) 。另外Controller对象还提供了对视频的pause()和seekTo等常规方法。

    VideoPlayerController的初始化:

    以播放assets文件夹下的视频为例,初始化播放控制器的代码如下:

    class VideoAutoPlayWhenReady extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _VideoState();
      }
    }
    
    class _VideoState extends State<VideoAutoPlayWhenReady> {
      VideoPlayerController controller;
      bool _isInit = false;
      _VideoState() {
        controller=VideoPlayerController.asset(
          'videos/butterfly.mp4',
          package: 'flutter_gallery_assets',
        );
        controller.setLooping(true);
        controller.setVolume(0.0);
        //还没准备好的时候没有不会播放
        controller.play();
       }
      }
    

    注意此时虽然调用了play但是是不能播放的,因为视频还没有初始化,视频的初始化放在了State对象的initState方法里:

      @override
      void initState() {
        super.initState();
        /
        controller.initialize().then((value){
            setState(() {
              _isInit = controller.value.initialized;
    
            });
        });
      }
    
      @override
      void dispose() {
        controller.dispose();
        super.dispose();
      }
    

    controller.initialize()用来初始化视频,类似于Android MediaPlayer的prepareAsync方法。初始化的过程的过程是一个异步过程,一个小细节需要注意,在页面dispose方法的时候需要调用 controller.dispose()。完成初始化可能需要耗费一定的时间,那么在这个时间端内我们肯定要展示用户展示一个提示,比如加载框的提示。所以demo中提供了如下代码来标识视频正在初始化:

    
      ///视频正在加载的界面
      Widget _buildInitingWidget(){
        return AspectRatio(
          aspectRatio: 3 / 2,
          child: Stack(
            children: <Widget>[
              VideoPlayer(controller),
              ///健在进度框
              const Center(child: CircularProgressIndicator()),
            ],
            fit: StackFit.expand,
          ),
        );
      }
    

    上述代码中使用了AspectRatio这个组件,这个组件可以某个UI展示固定的宽高比,在这里我们让视频的宽高比定义为3/2.运行效果如下:
    在这里插入图片描述
    看到没,在视频没有准备好的时候,有一个蓝色圆形的加载滚动条。当初始化完毕后就改变状态,不展示加载框就行了,核心代码如下:

    重写State的build方法:

     @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('点击视频可暂停和播放'),
          ),
          body:  Center(
            child: _isInit? _buildPlayingWidget():_buildInitingWidget()
          ),
        );
    
      }
    

    核心主要是这句child: _isInit? _buildPlayingWidget():_buildInitingWidget()
    如果是初始化完毕,则显示播放界面,否则展示初始化的页面。如果要相应点击视频页面对视频进行暂停和播放的话,可以套一个GestureDetector组件(主要代码点此查看):

      child: GestureDetector(
              onTap: () {
                if (controller.value.isPlaying) {
                  controller.pause();
                } else {
                  controller.play();
                }
              },
              child: VideoPlayer(controller),
            ));
    

    当然,如果要考虑到监听网络变化的话而对视频进行播放暂停控制,可以参考博主的Flutter网络状态变化监听demo源码,此处不再赘述,主要方法还是build方法:

     @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('监听网络变化'),
          ),
          body:  Center(
              child: _isInit?ConnectWidget(
                  ///wifi网络环境
                   wifiConnectWidget:PlayInWifiStatelessWidget(controller: controller,),
                   ///移动网络
                   mobileConnectWidget: PlayInMobileStatefulWidget(controller: controller,),
                   ///无网络
                   noneConnectWidget: PlayNonConnectStatelessWidget(controller: controller,)
              ):PlayNonConnectStatelessWidget(controller: controller,)
          ),
        );
    

    博客项目demo源码
    参考资料:Flutter官方视频播放资料
    Flutter网络状态变化监听

    展开全文
  • Flutter 视频播放器

    2019-12-17 15:25:26
    不知不觉学习Flutter已经很长一段时间,利用业余的时间对之前的项目进行了整理开源出来。希望能和同样在Flutter道路上闯荡的同志们共同进步成长。 项目特点 项目中采取了MVP的模式,代码结构清晰。 包含了开发的过程...

    不知不觉学习Flutter已经很长一段时间,利用业余的时间对之前的项目进行了整理开源出来。希望能和同样在Flutter道路上闯荡的同志们共同进步成长。

    项目特点

    • 项目中采取了MVP的模式,代码结构清晰。
    • 包含了开发的过程中常用的控件和自定义控件的书写。
    • 项目使用了大量的过渡动画,是页面交互更加流畅,顺滑。
    • 项目中使用现在目前主流的一些Plugin

    更多详细内容可以查看Github源码地址

    部分开发中的总结个人博客

    扫码体验App,密码 123456

    扫码下载

    效果图

    部分效果图如下

    如果感觉这个项目对你有所帮助,希望给个Star鼓励下,谢谢~,同时欢迎提Issue

    使用技术及实现内容

    • Flutter和原生交互的插件播放器封装使用 插件地址

    • 大量 Flutter Animation 使用

    • 部分自定的控件使用 (自定义搜索框等)

    • Sliver 复杂联动动画实现

    • Provider状态管理使用

    • 网络请求采用的是Dio ,对请求结果进行统一处理,使数据交互更加方便

    • 部分页面的管理采用了fluro 路由进行管理

    编译运行流程

    • 配置Flutter开发环境,详情见官网

    • Flutter Version v1.12.13+hotfix.5

    • Dart Version 2.5.0

    • clone 项目代码 执行 flutter packages get 或者打开 pubspec.yaml文件 点击 Package get,建议配置国内镜像

    ##注意事项

    • 本项目暂不支持IOS,由于暂时没有开发IOS播放器插件

    • 如果想体验的更流畅建议使用release版本,debug版本会有些许的卡顿属于正常现象

    感谢

    • flutter-go 包含常规组件的使用工程

    • flutter_wanandroid 玩安卓的Flutter客户端

    • KotlinMvp 感谢该项目的作者同意我使用本项目的UI。

    • flutter_deer 亮亮同学,现在同桌,基本同时开始踩坑Flutter,
      但是在中途的时候由于我手头的项目需求比较多,所以这个项目的开发一直搁置,亮亮同学把踩的部分坑都会和我分享,
      使我在开发的过程中少踩了许多坑。

    • 感谢所有的开源项目

    声明

    项目中的 API 均来自开眼视频,UI来自KotlinMvp,纯属学习交流使用,不得用于商业用途!

    展开全文
  • 一个Flutter的音乐播放器组件(即Spotify,Apple Music等)
  • 可以播放的音乐app 目前已实现功能有推荐页面、歌手页面、排行榜页面、专辑页面、歌曲播放页面、(个人中心界面、搜索界面) ...代码地址:https://github.com/Janenil/music_app_flutter ...

    可以播放的音乐app

    目前已实现功能有推荐页面、歌手页面、排行榜页面、专辑页面、歌曲播放页面、(个人中心界面、搜索界面)

    还未实现的功能有登陆注册、播放界面歌词部分、个人中心收藏喜欢歌单、搜索功能

    代码地址:https://github.com/Janenil/music_app_flutter

     

     

    展开全文
  • 基于flutter的仿网易云音乐播放器.zip,flutter music player application (仿网易云音乐)
  • 项目已开源到 Github:Vistor,欢迎大家 fork,star。...开发框架 ( Flutter sdk: ">=2.0.0-dev.68.0 <3.0.0" ): 状态管理:Scoped_model 网络层:Dio 导航库:Fluro 主模块分为首页...

    项目已开源到 Github:Vistor

     

    模块

     开发环境:

    • Vs Code (1.30.2)
    • Android Studio 3.+

    开发框架 ( Flutter sdk: ">=2.0.0-dev.68.0 <3.0.0" ):

    • 状态管理:Scoped_model
    • 网络层:Dio
    • 导航库:Fluro

    主模块分为首页、精选、电影、我的,以下是功能列表:

    • 使用 scoped_model 状态管理,实现state统一管理。
    • 使用 TabBar + TabBarView 实现单页面不同模块切换。
    • 使用 staggered_grid_view、ListView 组件展示图文列表。
    • 扩展列表组件,结合 NotificationManager 实现上拉加载更多数据,下拉刷新数据。
    • 精选内容,分类展示,使用SliverAppBar,增加交互动效,提高用户体验。
    • 自定义过滤菜单组件,结合 ScrollController 实现滑动交互效果。
    • 代码模块化  实现,组件封装实现代码复用。

    功能设计

    1. 使用 Fluro 管理全局路由,可自由配置 Scene 的转场动画,处理Android端的后退键事件
    2. 使用 Flutter 基本语法进行布局,并封装了一系列通用的组件,比如 AnimationText、过滤菜单,加载状态组件,共享动画组件等,便于全局复用
    3. 数据层使用Dio实现 Http / Https 网络加载,可轻松实现 http header、链接超时等常用配置。
    4. 使用 CachedImage 组件,实现图片的加载缓存,优化渲染显示性能。
    5. 引入 scoped_model 状态管理,Scoped 结合 ScopedModelDescendant ,设定全局 state 结构,管理相关的组件状态。
    6. 使用 shared_preferences 实现小数据的本地化存储。
    7. 使用第三方字体库,实现 FontFamily 的定制显示。
    8. 设置 WillPopScope,实现首页点击返回键提示两次快按退出功能。
    9. 首页非Index Tab 页面下,点击返回键,首先返回 Index Tab,再次点击提示两次退出。
    10.  ... ...

    核心功能分析

    (1)状态管理

    在项目实践之前,简单分析了Redux、scoped_model 等状态管理框架。最终选择在项目中使用 scoped_model 作为状态框架库,方便了项目中State状态数据统一管理,降低UI与Model间的代码耦合度。使用过程中发现 ScopedModel 下的部件如何需要根据State刷新,则 child 必须为 ScopedModelDescendant 包裹。否则会出现组件无法刷新的情况。

    (2)路由栈

    官方在路由方面已经提供了非常方便的操作。使用 Navigator 的 api 可以轻松实现路由栈的管理。fluro 路由栈框架在官方的基础上,提供了更高层次的功能封装。可以更加方便的对路由进行统一管理,配置。并且提供了丰富的转场动画供开发者使用。

    (3)网络

    官方在网络层为开发者提供了 Http api,方便我们处理普通的 Http 请求操作,例如 Post,Get 等。项目中采用了第三方网络请求库 dio。dio在网络层处理上更加方便高效,提供了很多高级功能,例如,请求链接超时、cookie、请求拦截等。同时使用了connectivity 来监听网络状态,用于用户体验上的优化。

    (4)本地持久化存储

    在 Android 原生开发中,小数据存储我们一般会采用SharedPreferences来实现。iOS中则是使用 NSUserDefaults 持久化保存。在该项目中,我们使用了 dart 版本的 第三方开源库 shared_preferences。shared_preferences 采用单利模式实现。通过使用setXXX | getXXX 可以非常方便的实现数据的本地持久化存储。

    (5)图片

    官方为开发者提供了Image | ImageAsset | ImageNetwork 方便开发者轻松实现加载本地图片与网络图片。为了用户体验,在该项目中引入了第三方图片加载库 cached_network_image。该库提供了图片加载中占位图、加载失败占位图等配置。同样,为了减少代码重复,将其组件作为子组件进行封装,统一管理配置。

    (6)列表

    和原生开发类似,在Flutter中实现列表是非常的简单快捷,避免了原生中创建 Adapter 的繁杂工作。仅仅需要我们配置列表数量,item组件即可完成。同样,为了在列表中提高用户体验,在项目中使用了 flutter_staggered_grid_view,该库对 Flutter 中的ListView、GridView 等组件进行封装,可以非常轻松的实现网格布局、瀑布流布局等效果。同样还提供了类似Android 中响应式布局效果。

    (7)转场动画

    官方路由栈 Navigator 中为开发者提供了转场动画的配置,例如 FadeIn、FadeOut 等。除了利用Navigator,我们可以使用 Hero 来实现Android原生开发中的共享元素动画效果(SharedElement)。所以在项目中,通过封装 Hero,并结合Image组件,实现了共享元素转场动画。

    (8)视频播放

    在视频播放组件上,官方并没有提供组件元素。第三方开源库 video_player 可以实现简单的视频播放,视频格式局限性大。所以采用了自己封装 Flutter Plugin 插件,实现跳转原生界面播放。未来会在现有的插件基础上,实现局部窗口播放效果。

    (9)主题切换

    在 Flutter 中实现主题切换,相对原生开发来说是非常简单的。只需要我们动态切换 ThemeData 即可。采用状态管理工具或者 组件间通信库 event_bus 来实现,都是可以的。

    (10)UI组件优化

    做过 React Native 开发的朋友,当组件渲染模块涉及业务逻辑时,为了避免在 render 中编写造成代码混乱,一般都会将组件及业务逻辑(例如State刷新操作等)捆绑抽离到方法中,然后在 render 中引用。那么在 Flutter 中这样写同样会造成问题。我们知道 Flutter 中分为 有状态 | 无状态 两种组件,当涉及 State 状态数据刷新时,会造成组件的重复创建渲染,增加CPU性能开销。所以,优化的做法是将组件及业务代码封装在一个新的 StatelessWidget 无状态组件中,虽然相对之前代码量有所增加,但是提升了UI渲染效率。

    项目结构

    资源文件夹/
    lib
    ├── main.dart
    ├── common
    ├── components
    ├── config
    ├── constants
    ├── delegate
    ├── events
    ├── models
    │   ├── pood
    │   └── state_model
    ├── pages
    │   ├── detail
    │   └── home
    │   ├── index
    │   └── mine
    │   ├── movie
    │   └── popular
    │   ├── theme
    ├── route
    ├── utils
    └assets

    依赖库

      部分图标采用了icons,查看具体的图标名称可到 ionics官方文档。依赖方式,cd 到项目根目录,执行:flutter get packages 

    • dio: ^1.0.13
    • fluro: ^1.4.0
    • timeago: ^2.0.10
    • scoped_model: ^1.0.1
    • event_bus: ^1.0.1
    • shimmer: ^0.0.6
    • connectivity: ^0.3.2
    • fluttertoast: ^2.2.7
    • shared_preferences: ^0.4.3
    • cached_network_image: ^0.5.1
    • flutter_swiper: ^1.1.4
    • flutter_spinkit: ^3.0.0
    • flutter_staggered_grid_view: ^0.2.6
    • flutter_webview_plugin: ^0.3.0+2
    • video_player:

                git:

                 url: https://github.com/songxiaoliang/flutter_video_player.git

    打包Apk

    1.生成签名Keystore文件,并将keystore签名文件放到android/app根目录下

    keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

    2.在gradle.properties文件下增加常量标识

    MYAPP_RELEASE_STORE_FILE=my-release-key.keystore 
    MYAPP_RELEASE_KEY_ALIAS=my-key-alias
    MYAPP_RELEASE_STORE_PASSWORD=123456
    MYAPP_RELEASE_KEY_PASSWORD=123456

    3.在app的build.gradle下的增加如下配置

    android { 
      ... 
      defaultConfig { 
        ... 
      } 
      signingConfigs { 
        release { 
            storeFile file(MYAPP_RELEASE_STORE_FILE) 
            storePassword MYAPP_RELEASE_STORE_PASSWORD 
            keyAlias MYAPP_RELEASE_KEY_ALIAS 
            keyPassword MYAPP_RELEASE_KEY_PASSWORD 
        } 
      } 
      buildTypes { 
        release { 
          // signingConfig signingConfigs.debug
          signingConfig signingConfigs.release 
        } 
      }
    }

    5.进入项目根目录,终端执行如下命令:

    flutter build apk  // 默认携带 --release

    flutter build apk 会默认打出 release 版本的安装包,apk文件会生成在android/app/build/outputs/apk/目录。

    效果图

          

             

     

       

    展开全文
  • https://pub.dartlang.org/packages/video_player https://juejin.im/post/5c925af4e51d45732644e81a https://juejin.im/post/5b4d9b3af265da0f8524e31a https://github.com/zhangjianli/FlutterMusicPl...
    展开全文
  • 在之前项目中有视频播放功能,使用了flutter官方出的video_player库完成实现。flutter官方所有插件,详见github.com/flutter/plu…官方的video_player,安卓是基于ExoPlayer,苹果是基于原生的...
  • [黑人视频]是一款基于flutter实现的在线视频播放app
  • FijkPlayer 第三方的一个视频播放器,这是一个大佬基于比利比利播放器封装的,有常用的API 可自定义样式 pub传送门 默认的样式 展示: 自定义的样式 展示: **使用:** fijkplayer: ^0.8.4 /// 声明一个...
  • github: https://github.com/befovy/fijkplayer demo: ...主要内容1、视频播放2、texture设置3、flutter页面打开flutter页面4、 native打开native页面5、 patch模块6、代码风格 1、视频播放 页面状态初始...
  • Flutter官方提供了一系列的插件的插件 来为Flutter提供众多原生系统级API调用,包括传感器、文件读写、数据库、轻量存储等等,这些插件大都是以原生、Dart间通过MethodChannel、EventChannel相互通信实现的。但...
  • 本来是要做一个仿网易云音乐的flutter项目,但是因为最近事情比较多,项目周期跨度会比较长,因此分几个步骤来完成。这是仿网易云音乐项目系列文章的第一篇。没有完全照搬网易云音乐的UI,借鉴了其中的黑胶唱机动画...
  •  二零一八年的最后一篇博客,写完博客就收拾东西回家了,想想就有点... 这次要实现的是一个可以拖动和缩放的播放器,文字总是苍白的,直接看效果吧:    功能分解:  要实现拖动,那么必须保存播放器的坐...
  • 当团队准备着手做 APP 时,我们把目标对准了 Flutter,尤其近期 Flutter 的使用热度一直不断攀升。由于第一次使用 Flutter,就想通过自己的实践去提升自己的能力。 在做 APP 时,我们用到了视频播放器,当前使用官方...
  • 为什么要用FlutterFlutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全...
  • 一、前言 相信做过移动端视频开发的同学应该了解,想要实现视频从普通播放到全屏播放的逻辑并不是很简单,比如在 GSYVideoPlayer 中的动态全屏切换效果,就使用了创建全新的 Surface 来替换实现: ...
  • Flutter Slider 进度条

    2020-07-28 23:30:20
    Flutter Slider 进度条
  • 本着开源精神,将自己独立完成的 Flutter 电影应用开源。项目利用豆瓣现有的 Api,打造了一个完整的电影展示 App。(部分 UI 仿豆瓣电影)。 项目是我的本科毕业设计,算不上完美,但也有那么一点精致。麻雀虽小,...
  • 依赖 dependencies: video_player: "0.7.2" chewie: ^0.9.6 ...import 'package:chewie/chewie.dart';...import 'package:flutter/cupertino.dart'; import 'package:video_player/video...
1 2 3 4 5 ... 20
收藏数 653
精华内容 261
关键字:

flutter播放器