Flutter自定义视频播放插件flick_video_player_custom的使用

Flutter自定义视频播放插件flick_video_player_custom的使用

基于 Flick Video Player

Based on Flick Video Player

Flick Video Player Custom

Flick Video Player Custom 是一个为 Flutter 设计的视频播放器。 video_player 插件提供了低级别的视频播放访问。Flick Player 在底层封装了 video_player,并为开发者提供了创建自己的用户界面和功能的基础架构。

特性

  • 点击视频时显示覆盖层
  • 更改视频播放速度
  • 更多自定义菜单选项
  • 编辑滑动条界面
  • 编辑全屏模式

移动端演示

视频比例 16:9

img

视频比例 9:16

img

设置表单

img

更多UI控制器(视频下方的暗色覆盖)

img

安装

在你的 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flick_video_player_custom: <latest_version>
  video_player: <latest_version>

如何使用

创建一个 FlickManager 并将其传递给 FlickVideoPlayer,确保在使用后释放 FlickManager

import 'package:flutter/material.dart';
import 'package:flick_video_player_custom/flick_video_player.dart';
import 'package:video_player/video_player.dart';

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late FlickManager flickManager1;
  late FlickManager flickManager2;

  [@override](/user/override)
  void initState() {
    super.initState();
    flickManager1 = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        "https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
      ),
      additionalOptions: [
        OptionModel(icon: Icons.hd, onPressFeature: () {}, name: 'Quality')
      ],
    );

    flickManager2 = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerMeltdowns.mp4",
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    flickManager1.dispose();
    flickManager2.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              FlickVideoPlayer(
                flickManager: flickManager1,
              ),
              FlickVideoPlayer(
                flickManager: flickManager2,
                flickVideoWithControls: const FlickVideoWithControls(
                  videoFit: BoxFit.fitWidth,
                  controls: FlickPortraitControls(),
                ),
                flickVideoWithControlsFullscreen: const FlickVideoWithControls(
                  controls: FlickLandscapeControls(),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

示例代码

import 'package:flutter/material.dart';
import 'package:flick_video_player_custom/flick_video_player.dart';
import 'package:video_player/video_player.dart';

import 'change_stream_page.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flick video player custom'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late FlickManager flickManager1;
  late FlickManager flickManager2;

  [@override](/user/override)
  void initState() {
    super.initState();
    flickManager1 = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        "https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
      ),
      additionalOptions: [
        OptionModel(
          icon: Icons.hd,
          onPressFeature: _onPressQuality,
          name: 'Quality',
        ),
      ],
    );

    flickManager2 = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerMeltdowns.mp4",
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    flickManager1.dispose();
    flickManager2.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              FlickVideoPlayer(flickManager: flickManager1),
              // FlickVideoPlayer(
              //   flickManager: flickManager2,
              //   flickVideoWithControls: const FlickVideoWithControls(
              //     videoFit: BoxFit.fitWidth,
              //     controls: FlickPortraitControls(),
              //   ),
              //   flickVideoWithControlsFullscreen: const FlickVideoWithControls(
              //     controls: FlickLandscapeControls(),
              //   ),
              // ),
            ],
          ),
        ),
      ),
    );
  }

  void _onPressQuality() async {
    Navigator.pop(context);
    Duration currentPosition = await flickManager1
            .flickVideoManager?.videoPlayerController?.position ??
        const Duration(milliseconds: 0);
    VideoPlayerController videoPlayerController = VideoPlayerController.network(
      "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4",
    );

    flickManager1.handleChangeVideo(
      videoPlayerController,
      videoChangeDuration: currentPosition,
      isKeepValueVideo: true,
    );

    flickManager1.flickControlManager?.togglePlay();
  }
}

更多关于Flutter自定义视频播放插件flick_video_player_custom的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义视频播放插件flick_video_player_custom的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flick_video_player_custom 是一个基于 video_playerflick 的 Flutter 插件,用于在 Flutter 应用中实现自定义视频播放器。它提供了更多的自定义选项和功能,比如播放控制、全屏模式、字幕支持等。

安装

首先,你需要在 pubspec.yaml 文件中添加 flick_video_player_custom 依赖:

dependencies:
  flutter:
    sdk: flutter
  flick_video_player_custom: ^0.3.0  # 使用最新版本

然后运行 flutter pub get 来安装依赖。

基本使用

  1. 导入包

    在你的 Dart 文件中导入 flick_video_player_custom

    import 'package:flick_video_player_custom/flick_video_player_custom.dart';
    
  2. 创建 FlickManager

    FlickManagerflick_video_player_custom 的核心类,它管理视频播放器的状态和控制器。

    FlickManager flickManager = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
      ),
    );
    
  3. 使用 FlickVideoPlayer

    在你的 UI 中使用 FlickVideoPlayer 组件来显示视频播放器:

    class VideoPlayerScreen extends StatelessWidget {
      final FlickManager flickManager;
    
      VideoPlayerScreen({required this.flickManager});
    
      [@override](/user/override)
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Custom Video Player'),
          ),
          body: Center(
            child: FlickVideoPlayer(
              flickManager: flickManager,
            ),
          ),
        );
      }
    }
    
  4. 释放资源

    在页面销毁时,记得释放 FlickManager 的资源,以避免内存泄漏:

    [@override](/user/override)
    void dispose() {
      flickManager.dispose();
      super.dispose();
    }
    

自定义播放器

flick_video_player_custom 提供了丰富的自定义选项,你可以通过传递不同的参数来定制播放器的外观和行为。

  1. 自定义控制条

    你可以通过 flickManager 来控制播放器的行为,比如播放、暂停、快进、快退等。

    FlickVideoPlayer(
      flickManager: flickManager,
      flickVideoWithControls: FlickVideoWithControls(
        controls: CustomControls(),
      ),
    );
    

    其中 CustomControls 是你自定义的控制条组件。

  2. 全屏模式

    flick_video_player_custom 支持全屏模式,你可以通过 flickManager 进入或退出全屏。

    flickManager.flickControlManager?.enterFullscreen();
    flickManager.flickControlManager?.exitFullscreen();
    
  3. 字幕支持

    你可以通过 flickManager 来加载和显示字幕。

    flickManager.flickControlManager?.setSubtitles([
      Subtitle(
        start: Duration(seconds: 0),
        end: Duration(seconds: 5),
        text: 'Hello, World!',
      ),
    ]);
    

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flick_video_player_custom/flick_video_player_custom.dart';
import 'package:video_player/video_player.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoPlayerScreen(),
    );
  }
}

class VideoPlayerScreen extends StatefulWidget {
  [@override](/user/override)
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late FlickManager flickManager;

  [@override](/user/override)
  void initState() {
    super.initState();
    flickManager = FlickManager(
      videoPlayerController: VideoPlayerController.network(
        'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    flickManager.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Video Player'),
      ),
      body: Center(
        child: FlickVideoPlayer(
          flickManager: flickManager,
        ),
      ),
    );
  }
}
回到顶部