Flutter视频播放插件jw_video_player的使用
Flutter视频播放插件jw_video_player的使用
注意:目前处于测试阶段
包版本:
- 0.0.2
描述:
使用此包可以将本地视频播放器嵌入到iOS、Android和Web应用中。
该包中的接口包括:
JWVideoPlayer
:视频播放器小部件JWPlayerController
:用于播放、暂停、停止等操作的控制器,并监听播放器值的变化。JWPlayerConfiguration
:配置播放器的参数。
示例
查看示例以了解库的实现方式。
使用方法
// 如果你正在使用移动设备,
// 需要在应用中设置你的许可证。
void main() async {
JWVideoPlayer.setLicenseKey({JW_LICENSE});
runApp(const App());
}
class App extends StatelessWidget {
JWPlayerConfiguration config1 = JWPlayerConfiguration(
file: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8"
);
const App({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Title',
home: PlayerApp(),
);
}
}
class PlayerApp extends StatefulWidget {
const PlayerApp({Key? key}) : super(key: key);
@override
State<PlayerApp> createState() => _PlayerAppState();
}
class _PlayerAppState extends State<PlayerApp> {
String _platformVersion = 'Unknown';
final JWPlayerController _controller = JWPlayerController();
@override
void initState() {
super.initState();
initPlatformState();
}
// 平台消息是异步的,因此我们在异步方法中进行初始化。
Future<void> initPlatformState() async {
String platformVersion;
// 平台消息可能会失败,所以我们使用try/catch来处理PlatformException。
// 我们还处理消息可能返回null的情况。
try {
JWVideoPlayer.setLicenseKey(GetLicense.getLicense());
} catch (e) {
debugPrint(e.toString());
}
try {
platformVersion = await JWVideoPlayer.getPlatformVersion() ?? 'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
// 如果在异步平台消息还在飞行时,小部件从树中移除,我们希望丢弃回复而不是调用setState来更新我们的不存在的外观。
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
@override
Widget build(BuildContext context) {
double height = MediaQuery.of(context).size.height;
double width = MediaQuery.of(context).size.width;
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Player version: $_platformVersion'),
),
body: Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
children: [
ConstrainedBox(
// 如果应用的宽高比为W:h,则限制宽度为70%,如果w:H则使用整个宽度。
constraints: BoxConstraints(maxWidth: height > width ? width : width * 0.7),
child: AspectRatio(
aspectRatio: 2.1,
child: JWVideoPlayer(
config: config1,
controller: _controller,
),
),
),
PlayerStatusView(controller: _controller),
],
),
bottomNavigationBar: Padding(
padding: const EdgeInsets.only(bottom: 15),
child: ButtonBar(
alignment: MainAxisAlignment.spaceAround,
children: [
IconButton(onPressed: _controller.play, icon: const Icon(Icons.play_arrow)),
IconButton(onPressed: _controller.pause, icon: const Icon(Icons.pause)),
IconButton(onPressed: _controller.stop, icon: const Icon(Icons.stop))
],
),
),
),
);
}
}
class PlayerStatusView extends StatelessWidget {
const PlayerStatusView({
Key? key,
required JWPlayerController controller,
}) : _controller = controller,
super(key: key);
final JWPlayerController _controller;
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: _controller,
builder: ((context, JWVideoPlayerValue value, child) => Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text(
"Player Controller Status",
style: TextStyle(fontWeight: FontWeight.bold),
),
Text("position: ${value.position.toString()}"),
const Padding(padding: EdgeInsets.all(2)),
Text("duration: ${value.duration.toString()}"),
const Padding(padding: EdgeInsets.all(2)),
Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text("buffered: "),
CircularProgressIndicator(
value: (value.bufferPercentage / 100),
backgroundColor: Colors.transparent,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.grey),
),
const Padding(padding: EdgeInsets.all(2)),
const Text("state: "),
Icon(value.state == PlayerState.playing
? Icons.play_circle
: Icons.pause_circle)
],
),
],
)),
);
}
}
Web端需求
在Dart端与上述相同,但不需要许可证,但需要添加播放器脚本,你可以从你的JWPlayer仪表板或使用JWPlayer管理API获取它。
<!DOCTYPE html>
<html>
<head>
...
<!-- 在这里设置你的JWPlayer脚本 -->
<!-- 这应该来自JW仪表板或请求更多信息在这里 https://docs.jwplayer.com/platform/docs/players-get-started -->
<script src="https://cdn.jwplayer.com/libraries/{PLAYER_ID}.js"></script>
...
</head>
<body>
...
</body>
</html>
更多关于Flutter视频播放插件jw_video_player的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter视频播放插件jw_video_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用jw_video_player
插件来播放视频的示例代码。请注意,你需要先确保你的Flutter环境已经设置好,并且已经添加了jw_video_player
依赖到你的pubspec.yaml
文件中。
步骤 1: 添加依赖
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
jw_video_player: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
步骤 2: 导入插件
在你想要使用视频播放功能的Dart文件中导入jw_video_player
插件:
import 'package:jw_video_player/jw_video_player.dart';
步骤 3: 使用JWVideoPlayer
下面是一个完整的示例,展示如何在Flutter应用中使用jw_video_player
插件来播放视频:
import 'package:flutter/material.dart';
import 'package:jw_video_player/jw_video_player.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Video Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: VideoPlayerScreen(),
);
}
}
class VideoPlayerScreen extends StatefulWidget {
@override
_VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
JWVideoPlayerController _controller;
@override
void initState() {
super.initState();
// 初始化视频控制器
_controller = JWVideoPlayerController.network(
'https://www.example.com/path/to/your/video.mp4', // 替换为你的视频URL
autoPlay: true,
looping: false,
);
// 监听视频结束事件
_controller.setVideoCompletedListener(() {
print('Video completed!');
});
// 监听视频错误事件
_controller.setVideoErrorListener((error) {
print('Video error: $error');
});
}
@override
void dispose() {
// 释放视频控制器资源
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Video Player Demo'),
),
body: Center(
child: _controller.value.initialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: JWVideoPlayer(_controller),
)
: Container(
child: CircularProgressIndicator(),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 控制视频播放/暂停
setState(() {
if (_controller.value.isPlaying) {
_controller.pause();
} else {
_controller.play();
}
});
},
tooltip: 'Play/Pause',
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
}
解释
- 依赖添加:确保在
pubspec.yaml
中添加了jw_video_player
依赖。 - 控制器初始化:在
initState
方法中初始化JWVideoPlayerController
,这里使用的是网络视频URL。 - 事件监听:添加了视频完成和视频错误的监听器。
- UI构建:使用
AspectRatio
和JWVideoPlayer
来构建视频播放界面,并在视频未初始化时显示加载指示器。 - 播放控制:通过
FloatingActionButton
实现播放/暂停控制。
请确保替换示例中的视频URL为你自己的视频地址,并根据需要进行进一步的自定义和扩展。