Flutter视频播放插件flutter_video_view的使用

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

Flutter视频播放插件flutter_video_view的使用

pub package GitHub license

语言: 中文 | English

flutter_video_view 是一个用于 Flutter 的视频播放器。<a href="https://pub.dev/packages/video_player">video_player</a> 插件提供了低级别的视频播放访问。

安装

请参阅 <a href="https://pub.dev/packages/video_player">video_player</a> 的具体配置步骤。

⚠️ 注意:无需在 pubspec.yaml 文件中添加 video_player 依赖。

使用前准备

版本约束

  sdk: ">=3.2.3 <4.0.0"
  flutter: ">=3.16.6"

依赖

  1. pubspec.yaml 文件中添加 flutter_video_view 依赖。
dependencies:
  flutter_video_view: ^最新版本
  1. 执行 Flutter 命令以获取包。
flutter pub get
  1. 引入包
import 'package:flutter_video_view/flutter_video_view.dart';

本地化配置

MaterialApp 中添加。

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        ...
        localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
            ...
            VideoViewLocalizationsDelegate.delegate,
        ],
        ...
    );
  }
}

使用方法

import 'package:flutter_video_view/flutter_video_view.dart';

final VideoPlayerController videoPlayerController = VideoPlayerController.xxx();

final view = VideoView(
  controller: VideoViewController(
    videoPlayerController: videoPlayerController,
    videoViewConfig: VideoViewConfig(),
  ),
);

弹出窗口是通过使用 <a href="https://github.com/LiWenHui96/flutter_video_view/blob/main/lib/src/video_config.dart" rel="ugc">VideoViewConfig</a> 实现的。

名称 类型 描述 默认值
width double? 视频的宽度 MediaQuery.of(context).size.width
height double? 视频的高度 MediaQuery.of(context).size.height
backgroundColor Color 视频背景颜色 Colors.black
tooltipBackgroundColor Color 显示音量、亮度、速度、播放进度等信息的控件背景颜色 Colors.black54
foregroundColor Color 视频按钮和文本的颜色 Colors.white
textSize double 文本大小 14
iconSize double 图标大小 16
useSafe bool 是否保持与顶部的安全距离 true
maxScale double 最大允许缩放比例 2.5
minScale double 最小允许缩放比例 0.8
panEnabled bool 是否允许平移 false
scaleEnabled bool 是否允许缩放 false
aspectRatio double? 视频的宽高比 null
allowedScreenSleep bool 定义是否在全屏时休眠 true
autoInitialize bool 启动时初始化视频。这将为播放做准备 false
autoPlay bool 视频显示后立即播放 false
startAt Duration? 视频首次播放时从哪里开始 null
volume double 视频音量(非设备音量) 1.0
looping bool 视频是否循环播放 false
overlay PlaceholderBuilder? 放置在视频和控制之间的控件 null
placeholderBuilder PlaceholderBuilder? 控件在不同初始化状态下的显示 null
fullScreenByDefault bool 自动播放时是否全屏播放 false
useRootNavigator bool 定义推送/弹出导航是否使用根导航器 true
deviceOrientationsEnterFullScreen List<DeviceOrientation>? 进入全屏时允许的设备方向 null
systemOverlaysExitFullScreen List<SystemUiOverlay> 退出全屏后可见的系统覆盖层 SystemUiOverlay.values
deviceOrientationsExitFullScreen List<DeviceOrientation> 退出全屏后允许的设备方向 DeviceOrientation.values
showControlsOnInitialize bool 初始化控件时是否显示控件 true
showControls FullScreenBuilder<bool>? 是否显示控件 true
hideControlsTimer Duration 控件隐藏前的持续时间 Duration(seconds: 3)
controlsType ControlsType 控件类型 ControlsType.normal
showBuffering bool 是否显示缓冲占位符 true
bufferingBuilder Widget? 缓冲时显示的占位符 null
finishBuilder FullScreenBuilder<Widget>? 播放完成时显示的控件 null
controlsBackgroundColor List<Color> 控件背景颜色 -
showCenterPlay bool 是否显示中间的播放按钮 true
centerPlayButtonBuilder CenterPlayButtonBuilder? 中间的播放按钮 null
canLongPress bool 是否可以通过长按播放视频 true
canChangeVolumeOrBrightness bool 是否可以调整音量或亮度 true
canChangeProgress bool 是否可以调整视频进度 true
canBack bool 是否显示返回按钮 true
title String? 视频标题 null
titleTextStyle TextStyle? 标题文本样式 null
topActionsBuilder FullScreenBuilder<List<Widget>>? 放置在顶部右侧的控件 null
canShowLock bool 是否显示锁定按钮 false
centerLeftActionsBuilder CenterActionsBuilder? 中间左侧的控件 null
centerRightActionsBuilder CenterActionsBuilder? 中间右侧的控件 null
bottomBuilder BottomBuilder? 用于定义底部控件和显示内容的布局 null
onTextPosition FullScreenBuilder<VideoTextPosition>? 进度条上进度信息的位置 null
onProgressBarGap FullScreenBuilder<double>? 进度条和时间信息控件之间的间隔 10
videoProgressBarColors VideoProgressBarColors? 进度条使用的默认颜色 null
maxPreviewTime Duration? 最大预览时长 null
maxPreviewTimeBuilder FullScreenBuilder<Widget>? 达到最大预览时长时显示的控件 null

示例代码

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

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_video_view/flutter_video_view.dart';

import 'page_video.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await redoSystemStyle();

  runApp(const MyApp());
}

/// 程序入口
class MyApp extends StatefulWidget {
  // ignore: public_member_api_docs
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        VideoViewLocalizations.delegate,
      ],
      supportedLocales: const <Locale>[Locale('en', 'US'), Locale('zh', 'CN')],
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
      routes: <String, WidgetBuilder>{'video': (_) => const VideoPage()},
      title: 'Video View Example',
    );
  }
}

/// 主页
class HomePage extends StatefulWidget {
  // ignore: public_member_api_docs
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String url = 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4';

  [@override](/user/override)
  Widget build(BuildContext context) {
    final Widget child = Center(
      child: ElevatedButton(
        onPressed: () async =>
            Navigator.pushNamed(context, 'video', arguments: url),
        child: const Text('视频'),
      ),
    );

    return Scaffold(
      appBar: AppBar(title: const Text('Video View Example')),
      body: SizedBox(width: double.infinity, child: child),
    );
  }
}

/// 处理状态栏和导航栏
Future<void> redoSystemStyle({bool isPortrait = true}) async {
  if (isPortrait) {
    await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
      DeviceOrientation.portraitUp,
    ]);
  } else {
    await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ]);
  }

  await SystemChrome.setEnabledSystemUIMode(
    SystemUiMode.manual,
    overlays: SystemUiOverlay.values,
  );

  SystemChrome.setSystemUIOverlayStyle(
    const SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      systemNavigationBarColor: Colors.transparent,
      systemNavigationBarContrastEnforced: true,
    ),
  );
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用flutter_video_view插件来播放视频的示例代码。请注意,这个插件可能不是官方或广泛使用的插件,所以确保你已经按照文档正确安装并配置了该插件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_video_view: ^x.y.z  # 请替换为实际的版本号

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

接下来,在你的Flutter项目中创建一个简单的页面来播放视频。下面是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:flutter_video_view/flutter_video_view.dart';

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

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

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

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late FlutterVideoViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Video View Example'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: FlutterVideoView(
              controller: _controller,
              url: 'https://www.example.com/path/to/your/video.mp4',  // 替换为你的视频URL
              autoPlay: true,  // 是否自动播放
              muted: false,  // 是否静音
              aspectRatio: 16/9,  // 视频的宽高比
            ),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              _togglePlayPause();
            },
            child: Text('Toggle Play/Pause'),
          ),
        ],
      ),
    );
  }

  void _togglePlayPause() {
    if (_controller.value.isPlaying) {
      _controller.pause();
    } else {
      _controller.play();
    }
  }

  @override
  void initState() {
    super.initState();
    _controller = FlutterVideoViewController(
      onInitialized: (controller) {
        setState(() {});  // 更新UI
      },
      onEnded: () {
        // 视频播放结束时调用
      },
      onError: (error) {
        // 视频播放出错时调用
      },
      onBuffering: (progress) {
        // 视频缓冲时调用
      },
    );
  }

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

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个视频播放器和一个用于切换播放/暂停的按钮。我们使用FlutterVideoView组件来播放视频,并通过FlutterVideoViewController来控制视频的播放状态。

请注意,这个示例假设flutter_video_view插件提供了一个与FlutterVideoViewController类似的控制器类,用于控制视频播放。如果实际的插件API与此不同,请参考插件的官方文档进行调整。

此外,由于网络视频URL可能无法直接播放(例如,由于CORS策略),你可能需要确保视频URL是可访问的,或者将视频文件托管在你的服务器上。

回到顶部