Flutter视频播放插件universal_videoplayer的使用
Flutter视频播放插件universal_videoplayer的使用
我们已经实现了一个跨平台视频播放器,提供了流畅的视频播放体验。
功能支持
功能 | iOS | Android | Windows | Linux | macOS | Web |
---|---|---|---|---|---|---|
网络视频 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
资源文件视频 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
本地文件视频 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
循环播放 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
自动播放 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
滑动控制音量 | ✔️ | ✔️ | 键盘方向键 | 键盘方向键 | 键盘方向键 | 键盘方向键 |
滑动快进快退 | ✔️ | ✔️ | 键盘方向键 | 键盘方向键 | 键盘方向键 | 键盘方向键 |
全屏模式 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
启动全屏模式 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
播放速度调节 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
快进快退 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SRT字幕 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
定制化 | 部分 | 部分 | 部分 | 部分 | 部分 | 部分 |
画中画(PIP) | 未实现(寻求帮助) | ✔️ | ✔️ | 已实现(未测试) | 已实现(崩溃,等待window_manager发布,GitHub已修复) | 未实现 |
视频播放器控件
移动端控件
- 水平滑动以在视频中向前或向后快进。 (
seekSwipes
) - 右侧屏幕垂直滑动以控制视频音量。 (
volumeSwipes
) - 左侧屏幕垂直滑动以控制视频亮度。 (
brightnessSwipes
) - 双击屏幕两侧以在视频中向前或向后快进。 (
doubleTapToSeek
) - 长按屏幕以加速视频,长按释放时减速。 (
onLongPressSpeedUp
)
桌面端控件
- 单击鼠标以切换播放和暂停。 (
desktopTapToPlayAndPause
) - 双击鼠标以切换全屏模式。 (
desktopDoubleTapToFullScreen
) - 使用键盘上下箭头增加或减少视频音量。 (
volumeArrows
) - 使用键盘左右箭头在视频中向前或向后快进。 (
seekArrows
) - 按下Esc键关闭全屏模式。 (
escapeKeyCloseFullScreen
) - 按下数字小键盘小数点键(.)以切换视频适应模式。 (
numPadDecimalKeyToggleFit
) - 按下Enter键打开全屏模式。 (
enterKeyOpensFullScreen
) - 按下空格键切换播放和暂停视频。 (
spaceKeyTogglePlay
)
初始化
void main() {
initMeeduPlayer(
androidUseFVP: true,
iosUseFVP: false,
);
runApp(const MyApp());
}
Android 和 iOS 替换原生视频播放器
Android
- 添加此包并设置
androidUseFVP
为true
在initMeeduPlayer
中。
iOS
- 添加此包并在
initMeeduPlayer
中设置iosUseFVP
为true
。
HLS 在 Web 上
在 pubspec.yaml
中添加:
video_player_web_hls: ^1.0.0+3
在 index.html
文件中添加以下脚本:
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest" type="application/javascript"></script>
放在 <script src="main.dart.js" type="application/javascript"></script>
或 <script src="flutter.js" defer></script>
之前。
示例代码
以下是完整的示例代码:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:universal_videoplayer/meedu_player.dart';
import 'package:universal_videoplayer_example/pages/basic_example_page.dart';
import 'package:universal_videoplayer_example/pages/fullscreen_example_page.dart';
import 'package:logging/logging.dart';
void main() {
Logger.root.level = Level.ALL;
Logger.root.onRecord.listen((record) {
print(
'${record.loggerName}.${record.level.name}: ${record.time}: ${record.message}');
});
initMeeduPlayer(
androidUseFVP: true,
iosUseFVP: false,
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: const HomePage(),
routes: {
"basic": (_) => const BasicExamplePage(),
"fullscreen": (_) => const FullscreenExamplePage(),
},
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
[@override](/user/override)
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
[@override](/user/override)
void initState() {
super.initState();
// SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Center(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(
padding: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
child: Text(
'基本示例',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
Wrap(
children: [
buildButton(
context,
text: '基本网络示例',
routeName: 'basic',
description: '加载网络视频示例。',
),
buildButton(
context,
text: '全屏示例',
routeName: 'fullscreen',
description: '启用全屏模式示例。',
),
],
),
],
),
),
),
),
);
}
Widget buildButton(BuildContext context,
{required String text,
required String description,
required String routeName}) {
return Card(
elevation: 30,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: InkWell(
onTap: () {
Navigator.pushNamed(context, routeName);
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(text, style: const TextStyle(fontSize: 18.0)),
const SizedBox(height: 8.0),
Text(description, style: const TextStyle(fontSize: 14.0)),
],
),
),
),
);
}
}
更多关于Flutter视频播放插件universal_videoplayer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频播放插件universal_videoplayer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
universal_videoplayer
是一个 Flutter 插件,用于在 Flutter 应用中播放视频。它支持多种平台,包括 Android、iOS 和 Web。以下是如何使用 universal_videoplayer
插件的步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 universal_videoplayer
插件的依赖:
dependencies:
flutter:
sdk: flutter
universal_videoplayer: ^0.1.0 # 请检查最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 universal_videoplayer
插件:
import 'package:universal_videoplayer/universal_videoplayer.dart';
3. 创建视频播放器
你可以使用 UniversalVideoPlayerController
来控制视频播放器。以下是一个简单的示例:
class VideoPlayerScreen extends StatefulWidget {
[@override](/user/override)
_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
UniversalVideoPlayerController _videoPlayerController;
[@override](/user/override)
void initState() {
super.initState();
_videoPlayerController = UniversalVideoPlayerController()
..initialize('https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4')
..addListener(() {
setState(() {});
});
}
[@override](/user/override)
void dispose() {
_videoPlayerController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Universal Video Player'),
),
body: Center(
child: _videoPlayerController.value.isInitialized
? AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: UniversalVideoPlayer(_videoPlayerController),
)
: CircularProgressIndicator(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_videoPlayerController.value.isPlaying
? _videoPlayerController.pause()
: _videoPlayerController.play();
});
},
child: Icon(
_videoPlayerController.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
}