Flutter视频播放插件flutter_video_view的使用
Flutter视频播放插件flutter_video_view的使用
语言: 中文 | 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"
依赖
- 在
pubspec.yaml
文件中添加flutter_video_view
依赖。
dependencies:
flutter_video_view: ^最新版本
- 执行 Flutter 命令以获取包。
flutter pub get
- 引入包
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
更多关于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是可访问的,或者将视频文件托管在你的服务器上。