Flutter视频控制插件flutter_video_controls的使用

Flutter视频控制插件flutter_video_controls的使用

flutter_video_controls 插件为 Flutter 应用提供了强大的视频播放控制功能。该插件基于 video_player 插件,并为其添加了友好的 Material 或 Cupertino UI。

预览

MaterialControls MaterialDesktopControls

CupertinoControls

安装

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

dependencies:
  flutter_video_controls: <latest_version>
  video_player: <latest_version>

使用它

首先,初始化 VideoPlayerController 并加载视频:

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

final videoPlayerController = VideoPlayerController.network(
    'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4');

await videoPlayerController.initialize();

final chewieController = ChewieController(
  videoPlayerController: videoPlayerController,
  autoPlay: true,
  looping: true,
);

final playerWidget = FlutterVideoControls(
  controller: chewieController,
);

确保在不再需要时释放控制器:

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

选项

flutter_video_controls 提供了一些控制视频播放的选项,默认情况下这些选项会出现在一个 showModalBottomSheet 中(类似于 YouTube):

要添加额外的选项,可以在 ChewieController 中添加以下代码:

additionalOptions: (context) {
  return [
    OptionItem(
      onTap: () => debugPrint('My option works!'),
      iconData: Icons.chat,
      title: 'My localized title',
    ),
    OptionItem(
      onTap: () => debugPrint('Another option that works!'),
      iconData: Icons.chat,
      title: 'Another localized title',
    ),
  ];
},

自定义模态表单

如果你不喜欢默认的 showModalBottomSheet,可以自定义视图:

optionsBuilder: (context, defaultOptions) async {
  await showDialog<void>(
    context: context,
    builder: (ctx) {
      return AlertDialog(
        content: ListView.builder(
          itemCount: defaultOptions.length,
          itemBuilder: (_, i) => ActionChip(
            label: Text(defaultOptions[i].title),
            onPressed: () => defaultOptions[i].onTap!(),
          ),
        ),
      );
    },
  );
},

翻译

要添加翻译字符串:

optionsTranslation: OptionsTranslation(
  playbackSpeedButtonText: '播放速度',
  subtitlesButtonText: '字幕',
  cancelButtonText: '取消',
),

字幕

从版本 1.1.0 开始,flutter_video_controls 支持字幕。你可以通过提供 List<Subtitle> 并使用 subtitleBuilder 函数来自定义字幕:

ChewieController(
  videoPlayerController: _videoPlayerController,
  autoPlay: true,
  looping: true,
  subtitle: Subtitles([
    Subtitle(
      index: 0,
      start: Duration.zero,
      end: const Duration(seconds: 10),
      text: '你好,我是字幕',
    ),
    Subtitle(
      index: 1,
      start: const Duration(seconds: 10),
      end: const Duration(seconds: 20),
      text: '你好吗?:)',
    ),
  ]),
  subtitleBuilder: (context, subtitle) => Container(
    padding: const EdgeInsets.all(10.0),
    child: Text(
      subtitle,
      style: const TextStyle(color: Colors.white),
    ),
  ),
);

示例

请运行应用以开始播放:

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final videoPlayerController = VideoPlayerController.network(
      'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
    );

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Video Controls Example')),
        body: Center(
          child: FutureBuilder(
            future: videoPlayerController.initialize(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                return FlutterVideoControls(
                  controller: ChewieController(
                    videoPlayerController: videoPlayerController,
                    autoPlay: true,
                    looping: true,
                  ),
                );
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

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

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

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

1 回复

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


当然,下面是一个关于如何使用flutter_video_controls插件来控制视频播放的示例代码。这个插件允许你在Flutter应用中轻松地添加视频控件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_video_controls: ^x.y.z  # 请替换为最新版本号
  video_player: ^x.y.z  # flutter_video_controls 依赖于 video_player,请确保版本兼容

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

接下来,下面是一个完整的示例代码,展示了如何使用flutter_video_controls插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Video Controls Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: VideoPlayerScreen(),
    );
  }
}

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

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化视频控制器,这里使用网络视频URL作为示例
    _controller = VideoPlayerController.network(
      'https://www.example.com/video.mp4', // 请替换为有效的视频URL
    )
      ..initialize().then((_) {
        // 确保在UI设置完成后才调用setState()
        setState(() {});
      });
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Player with Controls'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? 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,
        ),
      ),
      bottomNavigationBar: _controller.value.isInitialized
          ? VideoControls(
              controller: _controller,
              // 自定义控件,如果需要,可以添加更多自定义控件
              customControls: [
                // 示例:添加一个按钮来重置视频
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ElevatedButton(
                    onPressed: () {
                      setState(() {
                        _controller.seekTo(Duration.zero);
                      });
                    },
                    child: Text('Reset'),
                  ),
                ),
              ],
            )
          : Container(),
    );
  }
}

代码说明:

  1. 依赖项:在pubspec.yaml文件中添加flutter_video_controlsvideo_player依赖项。
  2. 主应用:创建一个简单的Flutter应用,包含一个主屏幕VideoPlayerScreen
  3. 视频控制器:在VideoPlayerScreen的状态类中初始化一个VideoPlayerController,用于控制视频的播放。
  4. UI布局
    • 使用AspectRatio来保持视频的宽高比。
    • 在视频控制器初始化后,显示视频播放器。
    • 添加一个浮动操作按钮(FAB)来控制播放/暂停。
    • 在底部导航栏中添加VideoControls小部件,它提供了基本的播放控制(播放/暂停、音量、进度条等)。
    • VideoControls中,你还可以添加自定义控件,如示例中的重置按钮。

确保替换示例中的视频URL为有效的视频地址,并根据需要进行进一步的自定义和样式调整。

回到顶部