flutter视频播放videoplayer与chewie

Posted 大前端Pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter视频播放videoplayer与chewie相关的知识,希望对你有一定的参考价值。

在Flutter中虽然官方提供了video_player来播放视频

video_player官网链接:video_player | Flutter Package

但是video_player只有单纯的播放功能,进度条 全屏这些功能只能自己实现

所以chewi出现了,是基于video_player的视频播放库,拥有视频进度条,全屏,播放速度控制等功能

chewi官网链接:chewie | Flutter Package

下面介绍如何使用这两个库:

如果你的视频是网络视频,那么需要做以下准备工作

如果你的设备是android,则需要配置网络权限

<uses-permission android:name="android.permission.INTERNET"/>

如下位置:

如果你的设备是ios

也需要配置权限

<key>NSAppTransportSecurity</key>

先来介绍video_player的用法

1.首先在pubspec.yaml文件里写上

video_player: ^2.4.4

如下所示: 

然后点击右上角的Pub get

如下所示

2.新建一个类,如下所示

class VideoPlayWidget extends StatefulWidget 
  const VideoPlayWidget(Key? key) : super(key: key);

  @override
  State<VideoPlayWidget> createState() => _VideoPlayWidgetState();


class _VideoPlayWidgetState extends State<VideoPlayWidget> 
  
  @override
  Widget build(BuildContext context) 
    return Container();
  
  

3.定义VideoPlayerController

late VideoPlayerController _controller;

初始化_controller

下面的url就是你想要播放的视频地址

_controller = VideoPlayerController.network(
    url)
  ..initialize().then((_) 
    setState(() 
      _controller.play();
      _controller.setLooping(false);
      if (second != null) 
        Duration duration = Duration(seconds: second!);
        _controller.seekTo(duration);
      
    );
  );

把控制器放入VideoPlayer播放

@override
Widget build(BuildContext context) 
  return _controller.value.isInitialized
      ? VideoPlayer(_controller)
      : Container();

运行项目,可以看到视频出来了,非常简单

但是此时视频比例不合适,这时我们要用到AspectRatio

@override
Widget build(BuildContext context) 
  return _controller.value.isInitialized
      ? AspectRatio(
      aspectRatio: _controller.value.aspectRatio,
      child: VideoPlayer(_controller))
      : Container();

再次运行项目,可以看到视频保持了合适的比例播放

下面我们再介绍chewie的用法,和上面video_player用法差不多

1.首先在pubspec.yaml文件里写上如下内容,因为chewie是基于view_player,所以view_player也要一起写上

chewie: ^1.3.3

video_player: ^2.4.4

这时需要定义两个控制器

一个是VideoPlayer的 一个是chewie的

late VideoPlayerController _controller;

ChewieController? chewieController;

然后初始化

_controller = VideoPlayerController.network(url)
  ..initialize().then((_) 
    setState(() 
      chewieController = ChewieController(
        videoPlayerController: _controller,
        autoPlay: false,
        looping: true,
        allowFullScreen: true,
        showOptions:false,
        deviceOrientationsOnEnterFullScreen: [DeviceOrientation.landscapeLeft],
        deviceOrientationsAfterFullScreen:[DeviceOrientation.portraitUp],
      );
    );
  );

然后是使用

@override
Widget build(BuildContext context) 
  return _controller.value.isInitialized ?ClipRRect(
    borderRadius: const BorderRadius.all(Radius.circular(5)),
    child: chewieController == null?Container():Chewie(controller: chewieController!)): Container();

效果如下

关注V X 公众号:大前端Pro 发送关键字   视频播放   获取示例代码

Flutter videoplayer

视频播放项目地址
效果图

从pub.dev搜索视频播放库,但都不能满足要求,最后下载flick-video项目代码,做了功能简化和修改。

实现功能:

列表播放时,不支持拖动修改进度亮度声音,避免滑动冲突,全屏和单一视频播放时支持

1、屏幕左侧上下滑动修改屏幕亮度
2、屏幕右侧上下滑动修改视频音量
3、横向滑动切换播放进度
4、长按2倍速播放
5、支持全屏播放,并且全屏时可手动切换全屏播放方向
6、列表滑动自动播放

代码结构

Container(
          width: double.infinity,
          height: 200,
          child: VideoPlayerWidget(
              videoManager: videoManager,
              videoWithControls: VideoPlayerWithControlWidget(
                controls:VideoControlWidget(videoManager: videoManager),
              )),
        ),

1. VideoPlayerWidget

使用MultiProvider注册监听
videoManagerModel :控制video player,播放暂停设置监听等操作;
viewManagerModel :控制播放过程的ui更新;

2. VideoPlayerWithControlWidget

置放视频播放器,即一些触屏操作
GestureDetector:点击、长按、横向拖动、纵向拖动操作

3 . VideoControlWidget

视频播放控制界面,操作时通过model执行操作更新界面
=注意Stack内部Positioned的lef top bottom right 对子组件尺寸的影响,开发过程遇到 因为位置设置错误影响其他组件被遮挡看不见 误以为未显示 的问题=

整个项目实质两个叠加界面 下层视频界面负责播放 上层ui界面负责控制,最外层MultiProvider监听

开发过程遇到的问题

1. Volume和Brightness调控需要通过MethodChannel

2. Satck内部Positioned位置对尺寸的影响

3. 全屏播放使用OverlayEntry显示,控制屏幕方向 实现

4. 注意状态切换,videoManagerModle中_videoListener()中有详细区分


以上是关于flutter视频播放videoplayer与chewie的主要内容,如果未能解决你的问题,请参考以下文章

Flutter videoplayer

Flutter videoplayer

Flutter videoplayer

Flutter视频和图片轮播

flutter开发仿抖音首页面上下滑动切换播放视频效果

如何在 Flutter 中保持屏幕关闭的视频播放?