Flutter自定义视频播放器(播放、暂停、倍速、拖动视频进度)

Flutter自定义视频播放器

在pubspec.yaml 添加video_playerdropdown_button2

在这里插入图片描述

添加完成后在需要视频的dart文件引入

import 'package:video_player/video_player.dart';
import 'package:dropdown_button2/dropdown_button2.dart';

具体代码

//定义一个VideoPlayerController
var _videoPlayerController;
//监听视频是否在播放
bool _isPlaying = false;
//视频地址
String videoUrl="";
//显示隐藏功能栏
bool _isShow = true;
//显示倍速
String _selectedValue = '倍速';
List<String> items = ['1.0', '0.75', '0.5', '0.25'];

//在initstate中初始化
@override
void initState() {
	_videoPlayerController =
        VideoPlayerController.network(videoUrl)
          ..initialize().then((_) {
            // 确保在初始化视频后显示第一帧,直至在按下播放按钮。
            setState(() {});
          });
    //执行监听,只要有内容就会刷新
    _videoPlayerController.addListener(() {
      setState(() {
        _isPlaying = _videoPlayerController.value.isPlaying;
      });
    });
}
 @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Video Demo',
      home: Scaffold(
        body:Container(
         color: Color(0XFF000000),
          child: Center(
            child: GestureDetector(
              child: Container(
                width: double.infinity,
                height: double.infinity,
                color: Color(0XFF000000),
                child: new Stack(
                  alignment: Alignment.center,
                  children: [
                    viDeoPlayer(),
                    _isPlaying && _isShow
                        ? new Positioned(
                            bottom: 0,
                            left: 0,
                            right: 0,
                            child: Container(
                              padding: const EdgeInsets.only(
                                  right: 10, left: 10),
                              color:
                                  Color.fromRGBO(0, 0, 0, 0.5),
                              height: 88,
                              child: new Row(
                                mainAxisAlignment:
                                    MainAxisAlignment
                                        .spaceEvenly,
                                children: [
                                  //暂停按钮
                                  InkWell(
                                    child: Icon(
                                      Icons.pause,
                                      size: 36,
                                      color: Color(0xffefefef),
                                    ),
                                    onTap: () {
                                      _videoPlayerController
                                          .pause();
                                    },
                                  ),
                                  //当前播放进度
                                  new Text(
                                    formatString(
                                        _videoPlayerController
                                            .value.position),
                                    style: TextStyle(
                                        fontSize: 18,
                                        color:
                                            Color(0xffefefef)),
                                  ),
                                  //进度条
                                  new Expanded(
                                    child: Slider(
                                      activeColor:
                                          Color(0xffFFFFFF),
                                      max: _videoPlayerController
                                          .value
                                          .duration
                                          .inMilliseconds
                                          .truncateToDouble(),
                                      value:
                                          _videoPlayerController
                                              .value
                                              .position
                                              .inMilliseconds
                                              .truncateToDouble(),
                                      onChanged: (newRating) {
                                        _videoPlayerController
                                            .seekTo(Duration(
                                                milliseconds:
                                                    newRating
                                                        .truncate()));
                                      },
                                    ),
                                    flex: 1,
                                  ),
                                  //总视频进度
                                  new Text(
                                    formatString(
                                        _videoPlayerController
                                            .value.duration),
                                    style: TextStyle(
                                        fontSize: 18,
                                        color:
                                            Color(0xffefefef)),
                                  ),
                                  //倍速下拉菜单
                                  DropdownButtonHideUnderline(
                                    child: DropdownButton2(
                                      hint: Text(
                                        _selectedValue,
                                        style: TextStyle(
                                          fontSize: 18,
                                          color:
                                              Color(0xffefefef),
                                        ),
                                      ),
                                      items: items
                                          .map((item) =>
                                              DropdownMenuItem<
                                                  String>(
                                                value: item,
                                                child: Text(
                                                  '${item}x',
                                                  style:
                                                      const TextStyle(
                                                    fontSize:
                                                        16,
                                                  ),
                                                ),
                                              ))
                                          .toList(),
                                      // value: _selectedValue,
                                      icon: Visibility(
                                          visible: false,
                                          child: Icon(Icons
                                              .arrow_downward)),
                                      onChanged: (value) async {
                                        double val =
                                            double.parse(value
                                                as String);
                                         _videoPlayerController
                                          .setPlaybackSpeed(val);
                                        setState(() {
                                          if (val == 1.0) {
                                            _selectedValue =
                                                '倍速';
                                          } else {
                                            _selectedValue =
                                                '${value as String}x';
                                          }
                                        });
                                      },
                                      dropdownWidth: 100,
                                      buttonWidth: 60,
                                      iconSize: 36,
                                      iconEnabledColor:Colors.white,
                                      buttonPadding:const EdgeInsets.only(left: 10),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          )
                        : new Container(),
                    _isPlaying
                     ? new Container() :
                      InkWell(
                      	child: Icon(
                          Icons.play_arrow,
                          size: 72,
                          color: Color(0xffefefef),
                        ),
                        onTap: () {
                          _videoPlayerController
                              .play();
                        },
                      ),
                  ],
                ),
              ),
              onTap: () {
                setState(() {
                //点击显示隐藏功能栏
                  _isShow = !_isShow;
                });
              },
            ),
          ),
        ),
      ),
    );
  }
  //******************建议视频播放控件封装成类或函数************************
  Widget viDeoPlayer() {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Color(0xff000000),
      child: Center(
        //  _controller.value.initialized表示视频是否已加载并准备好播放,
        // 如果是true则返回AspectRatio(固定宽高比的组件,宽高比为视频本身的宽高比)
        // VideoPlayer为视频插放器,对像就是前面定义的_controller
        child: _videoPlayerController.value.isInitialized
            ? AspectRatio(
                aspectRatio: _videoPlayerController.value.aspectRatio,
                child: VideoPlayer(_videoPlayerController),
              )
            //如果视频没有加载好或者因网络原因加载不出来则返回Container 组件
            //一般用于放置过渡画面
            : Container(
                child: Text("没有要播放的视频"),
              ),
      ),
    );
  }
   String formatString(time) {
    var shortName = time.toString().substring(2, 7);
    return shortName;
  }
//销毁videoPlayerController
@override
 void dispose() {
   // TODO: implement dispose
   _videoPlayerController.dispose();
   super.dispose();
 }
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flutter 提供了一个名为 `video_player` 的插件,可以用于在 Flutter 应用程序中播放视频。使用 `video_player` 插件,你可以轻松地将视频嵌入到你的应用程序中,并控制视频播放暂停、停止等操作。 以下是一个简单的示例代码,演示如何使用 `video_player` 插件播放本地视频文件: ```dart import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Video Player Demo', home: VideoPlayerScreen(), ); } } class VideoPlayerScreen extends StatefulWidget { @override _VideoPlayerScreenState createState() => _VideoPlayerScreenState(); } class _VideoPlayerScreenState extends State<VideoPlayerScreen> { VideoPlayerController _controller; @override void initState() { super.initState(); _controller = VideoPlayerController.asset('assets/sample_video.mp4') ..initialize().then((_) { setState(() {}); }); } @override void dispose() { super.dispose(); _controller.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Video Player Demo'), ), body: Center( child: _controller.value.initialized ? AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ) : Container(), ), floatingActionButton: FloatingActionButton( onPressed: () { setState(() { _controller.value.isPlaying ? _controller.pause() : _controller.play(); }); }, child: Icon( _controller.value.isPlaying ? Icons.pause : Icons.play_arrow, ), ), ); } } ``` 在上面的示例代码中,我们首先创建了一个 `VideoPlayerController` 对象,并使用 `asset` 方法加载了一个本地视频文件。然后,在 `initState` 方法中,我们初始化了 `VideoPlayerController` 对象,并在初始化完成后调用了 `setState` 方法,以便更新 UI。接下来,在 `build` 方法中,我们使用 `AspectRatio` 和 `VideoPlayer` 将视频嵌入到应用程序中,并使用一个浮动操作按钮控制视频播放暂停

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值