Flutter视频控制插件universal_video_controls的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter视频控制插件 universal_video_controls 的使用

universal_video_controls 是一个为Flutter应用提供通用视频控制功能的插件。它支持多种视频播放器后端,只要这些后端实现了 AbstractPlayer 接口。下面是如何安装和使用这个插件的详细指南。

概述

universal_video_controls 插件是基于 media_kit 控件开发的,并进行了泛化处理,使其能够与任何符合要求的视频播放器后端兼容。这使得开发者可以轻松地为他们的应用添加一致且功能丰富的视频控件。

截图展示

桌面端 移动端
Desktop with Controls Mobile with Controls

示例代码

完整的示例代码可以在以下链接中找到:

开始使用

安装

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

dependencies:
  universal_video_controls: ^1.0.10
  universal_video_controls_video_player: ^1.0.1
  video_player: ^2.2.5

然后运行 flutter pub get 来安装这些包。

使用

要使用 universal_video_controls 包,你需要将其与实现了 AbstractPlayer 接口的视频播放器后端集成。以下是与 video_player 包结合使用的最小示例:

示例:单个播放器单个视频

import 'package:flutter/material.dart';
import 'package:universal_video_controls/universal_video_controls.dart';
import 'package:universal_video_controls_video_player/universal_video_controls_video_player.dart';
import 'package:video_player/video_player.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SinglePlayerSingleVideoScreen(),
    );
  }
}

class SinglePlayerSingleVideoScreen extends StatefulWidget {
  @override
  State<SinglePlayerSingleVideoScreen> createState() => _SinglePlayerSingleVideoScreenState();
}

class _SinglePlayerSingleVideoScreenState extends State<SinglePlayerSingleVideoScreen> {
  late VideoPlayerController _controller;
  bool _isInitialized = false;

  @override
  void initState() {
    super.initState();
    _initializeVideoPlayer('https://www.example.com/video.mp4');
  }

  void _initializeVideoPlayer(String source) async {
    _controller = VideoPlayerController.network(source);
    await _controller.initialize();
    setState(() {
      _isInitialized = true;
    });
    _controller.play();
    _controller.addListener(() {
      if (_controller.value.hasError) {
        debugPrint(_controller.value.errorDescription);
      }
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Video Player'),
      ),
      body: Center(
        child: _isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoControls(
                  player: VideoPlayerControlsWrapper(_controller),
                ),
              )
            : const CircularProgressIndicator(),
      ),
    );
  }
}

选择现有的视频控件

你可以通过修改 controls 参数来选择不同的控件样式。例如,使用 Material 风格或 Cupertino 风格的控件:

Scaffold(
  body: VideoControls(
    controller: controller,
    controls: MaterialVideoControls,
  ),
);

Scaffold(
  body: VideoControls(
    controller: controller,
    controls: CupertinoVideoControls,
  ),
);

构建自定义视频控件

你也可以传递一个自定义的构建函数作为 controls 参数:

Scaffold(
  body: VideoControls(
    controller: controller,
    controls: (state) {
      return Center(
        child: IconButton(
          onPressed: () {
            state.widget.controller.player.playOrPause();
          },
          icon: StreamBuilder(
            stream: state.widget.controller.player.stream.playing,
            builder: (context, playing) => Icon(
              playing.data == true ? Icons.pause : Icons.play_arrow,
            ),
          ),
        ),
      );
    },
  ),
);

使用和修改视频控件

你可以根据平台选择适应性的控件,如 AdaptiveVideoControls,并进行主题定制。

MaterialVideoControlsTheme(
  normal: MaterialVideoControlsThemeData(
    buttonBarButtonSize: 24.0,
    buttonBarButtonColor: Colors.white,
    topButtonBar: [
      const Spacer(),
      MaterialDesktopCustomButton(
        onPressed: () {
          debugPrint('Custom "Settings" button pressed.');
        },
        icon: const Icon(Icons.settings),
      ),
    ],
  ),
  fullscreen: const MaterialVideoControlsThemeData(
    displaySeekBar: false,
  ),
  child: Scaffold(
    body: VideoControls(
      controller: controller,
    ),
  ),
);

更多关于Flutter视频控制插件universal_video_controls的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频控制插件universal_video_controls的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用universal_video_controls插件来控制视频播放的一个基本示例。这个插件提供了一个通用的视频控制器,可以方便地集成到Flutter应用中。

首先,确保你已经在pubspec.yaml文件中添加了universal_video_controls依赖:

dependencies:
  flutter:
    sdk: flutter
  universal_video_controls: ^最新版本号  # 请替换为实际最新版本号

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

接下来,我们创建一个简单的Flutter应用,使用universal_video_controls来控制视频播放。

import 'package:flutter/material.dart';
import 'package:universal_video_controls/universal_video_controls.dart';
import 'package:chewie/chewie.dart';
import 'package:video_player/video_player.dart';

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

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

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  VideoPlayerController _controller;
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    // 初始化视频控制器
    _controller = VideoPlayerController.network(
      'https://www.example.com/video.mp4', // 替换为你的视频URL
    )
      ..initialize().then((_) {
        // 初始化Chewie控制器
        setState(() {
          _chewieController = ChewieController(
            videoPlayerController: _controller,
            aspectRatio: _controller.value.aspectRatio,
            autoPlay: false,
            looping: false,
            // 使用UniversalVideoControls作为自定义控件
            customControls: UniversalVideoControls(),
          );
        });
      });
  }

  @override
  void dispose() {
    _controller.dispose();
    _chewieController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Player with Universal Controls'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? Chewie(
                controller: _chewieController,
              )
            : Container(
                child: CircularProgressIndicator(),
              ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 使用VideoPlayerController加载网络视频。
  2. 使用Chewie包来创建一个包含视频播放功能的UI组件。Chewie是一个基于video_player插件的封装,提供了更丰富的播放功能。
  3. UniversalVideoControls作为ChewieControllercustomControls属性,以使用universal_video_controls插件提供的视频控制界面。

请注意,universal_video_controls的具体用法可能会根据其版本和API的更新而有所变化,因此请参考最新的文档和示例代码以确保最佳实践。如果你遇到任何问题,也可以查阅该插件的GitHub仓库或相关文档获取更多信息。

回到顶部