• Flutter之播放视频


    通过本篇博文你可以了解如下知识点:
    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',
    )
    1
    2
    3
    4
    5
    如果想要播放网络视频的话就使用network方法:

    static const String beeUri = 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4';
    final VideoPlayerController beeController = VideoPlayerController.network(beeUri);
    1
    2
    在播放视频的时候需要先调用initialize()方法初始化,该方法为异步方法,返回一个Future对象。在initialize()调用之前调用play()方法是没法播放的,initialize()初始化完成后会自动播放。 那么完成了initialize之后怎么让视频渲染出来呢?就需要将controller对象交给VideoPlayer(controller) 。另外Controller对象还提供了对视频的pause()和seekTo等常规方法。

    上面说过初始化的过程的过程是一个异步过程,完成初始化可能需要耗费一定的时间,那么在这个时间端内我们肯定要展示用户展示一个提示,不如加载框的提示。所以demo中提供了如下代码来标识视频正在初始化:


    ///视频正在加载的界面
    Widget _buildInitingWidget(){
    return AspectRatio(
    aspectRatio: 3 / 2,
    child: Stack(
    children: <Widget>[
    VideoPlayer(controller),
    ///健在进度框
    const Center(child: CircularProgressIndicator()),
    ],
    fit: StackFit.expand,
    ),
    );
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    上述代码中使用了AspectRatio这个组件,这个组件可以某个UI展示固定的宽高比,在这里我们让视频的宽高比定义为3/2.运行效果如下:

    当初始化完毕后就改变状态,不展示加载框就行了,核心代码如下:

    @override
    void initState() {
    super.initState();
    controller.initialize().then((value){
    ///调用setState方法重绘UI
    setState(() {
    ///判断是否初始化
    _isInit = controller.value.initialized;

    });
    });
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    重写State的build方法:

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

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

    child: GestureDetector(
    onTap: () {
    if (controller.value.isPlaying) {
    controller.pause();
    } else {
    controller.play(http://www.my516.com);
    }
    },
    child: VideoPlayer(controller),
    ));
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    当然,如果要考虑到监听网络变化的话而对视频进行播放暂停控制,可以参考博主的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,)
    ),
    );
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    博客项目demo源码
    参考资料:Flutter官方视频播放资料
    Flutter网络状态变化监听
    ---------------------

  • 相关阅读:
    做最简单的自定义控件!
    DataGridView取消默认选中行
    好看的vs皮肤
    rdlc插入图像(.net2010)
    学习c#反射的一个例子
    C#Winform中ToolTip的简单用法
    rdlc报表显示条码 .
    vb.net ctype用法
    一些常用的正则表达式 .
    C# WinForm中MenuStrip动态菜单使用总结
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11102120.html
Copyright © 2020-2023  润新知