Flutter视频播放插件video_player_win的使用
Flutter视频播放插件video_player_win的使用
简介
video_player_win
是一个为 Windows 平台设计的轻量级 Flutter 视频播放插件,它使用 Windows 内置的 Media Foundation API。它是 video_player
插件在 Windows 平台上的实现。
平台支持
- 该插件本身仅支持 Windows。
- 与
video_player
插件结合使用时,您的应用可以同时支持 Windows、Android、iOS 和 Web。
功能和限制
功能
- GPU硬件加速,低CPU占用(可能支持4K 60fps视频)
- 不包含GPL/LGPL第三方库
- 只添加一个约130KB的DLL文件作为插件
- 通过与
video_player
合作,支持 Windows/Android/iOS/Web
限制
- 不支持HLS (.m3u8) 格式
- 播放依赖于Windows操作系统预加载的编解码器。如果需要播放不被这些预加载编解码器支持的格式,则需安装第三方编解码器包(如K-Lite Codec Pack或Windows 10 Codec Pack)。
支持的格式
由于 video_player_win
使用的是 Windows 内置的 Media Foundation API,因此它可以播放所有能被 Windows Media Player 播放的媒体格式。如果您遇到无法播放的文件,且该文件也不能通过 Windows Media Player 播放,那么您可能需要安装额外的编解码器包来扩展支持的格式范围。
对于 AV1 视频格式的支持,可以通过安装 Microsoft Store 的 AV1 编解码器 或者下载并安装 AV1 编解码器安装程序 来实现。
安装
将以下内容添加到项目的 pubspec.yaml
文件中:
dependencies:
video_player: ^2.5.1
video_player_win: ^2.0.0
或者从 GitHub 直接引用最新版本:
dependencies:
video_player: ^2.5.1
video_player_win:
git:
url: https://github.com/jakky1/video_player_win.git
ref: master
使用方法
视频/音频播放
从网络资源播放
var controller = VideoPlayerController.network("https://www.your-web.com/sample.mp4");
controller.initialize().then((value) {
if (controller.value.isInitialized) {
controller.play();
} else {
log("video file load failed");
}
}).catchError((e) {
log("controller.initialize() error occurs: $e");
});
从文件播放
var controller = VideoPlayerController.file(File("E:\\test.mp4"));
如果文件是视频,构建一个显示视频帧的小部件:
Widget build(BuildContext context) {
return VideoPlayer(controller);
}
操作
- 播放:
controller.play();
- 暂停:
controller.pause();
- 定位:
controller.seekTo(Duration(minutes: 10, seconds: 30));
- 设置播放速度(正常速度:1.0):
controller.setPlaybackSpeed(1.5);
- 设置音量(最大:1.0,静音:0.0):
controller.setVolume(0.5);
- 设置循环:
controller.setLooping(true);
- 释放资源:
controller.dispose();
监听播放事件和值
void onPlaybackEvent() {
final value = controller.value;
// value.isInitialized (bool)
// value.size (Size, 视频尺寸)
// value.duration (Duration)
// value.isPlaying (bool)
// value.isBuffering (bool)
// value.isCompleted (bool)
// value.position (Duration)
}
controller.addListener(onPlaybackEvent);
...
controller.removeListener(onPlaybackEvent); // 记得移除监听器
示例代码
下面是一个完整的示例代码,演示了如何使用 video_player_win
播放本地视频文件,并提供了一些基本控件:
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:video_player_win/video_player_win.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late WinVideoPlayerController controller;
void reload() {
controller.dispose();
controller = WinVideoPlayerController.file(File("D:\\test\\test_youtube.mp4"));
controller.initialize().then((value) {
if (controller.value.isInitialized) {
controller.play();
controller.setLooping(true);
setState(() {});
controller.addListener(() {
if (controller.value.isCompleted) {
log("ui: player completed, pos=${controller.value.position}");
}
});
} else {
log("video file load failed");
}
}).catchError((e) {
log("controller.initialize() error occurs: $e");
});
setState(() {});
}
@override
void initState() {
super.initState();
reload();
}
@override
void dispose() {
super.dispose();
controller.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('video_player_win example app'),
),
body: Stack(children: [
Container(
color: Colors.black,
child: WinVideoPlayer(controller),
),
Positioned(
bottom: 0,
child: Column(children: [
ValueListenableBuilder<WinVideoPlayerValue>(
valueListenable: controller,
builder: ((context, value, child) {
int minute = value.position.inMinutes;
int second = value.position.inSeconds % 60;
String timeStr = "$minute:$second";
if (value.isCompleted) timeStr = "$timeStr (completed)";
return Text(timeStr,
style: Theme.of(context).textTheme.headlineMedium!.copyWith(color: Colors.white, backgroundColor: Colors.black54));
}),
),
ElevatedButton(onPressed: () => reload(), child: const Text("Reload")),
ElevatedButton(onPressed: () => controller.play(), child: const Text("Play")),
ElevatedButton(onPressed: () => controller.pause(), child: const Text("Pause")),
ElevatedButton(onPressed: () => controller.seekTo(Duration(milliseconds: controller.value.position.inMilliseconds + 10 * 1000)), child: const Text("Forward")),
ElevatedButton(onPressed: () {
int ms = controller.value.duration.inMilliseconds;
var tt = Duration(milliseconds: ms - 1000);
controller.seekTo(tt);
}, child: const Text("End")),
])),
]),
),
);
}
}
此代码创建了一个简单的应用程序界面,允许用户播放、暂停、快进以及重新加载视频。同时,它还展示了如何获取和显示当前播放时间,并处理播放完成等事件。
更多关于Flutter视频播放插件video_player_win的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频播放插件video_player_win的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,video_player_win
是一个专门用于 Windows 平台的视频播放插件。虽然 video_player_win
并不是一个官方插件,但基于你的需求,我将展示一个使用 Flutter 的官方插件 video_player
和 chewie
(用于封装 video_player 控件)在 Windows 平台播放视频的示例。请注意,video_player
插件支持多种平台,包括 Windows,而 chewie
提供了用户友好的播放界面。
首先,你需要在 pubspec.yaml
文件中添加这些依赖:
dependencies:
flutter:
sdk: flutter
video_player: ^2.2.17 # 请检查最新版本号
chewie: ^1.2.2 # 请检查最新版本号
然后运行 flutter pub get
来获取这些依赖。
接下来,在你的 Dart 文件中,你可以按照以下方式使用这些插件:
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class VideoPlayerWithControls extends StatefulWidget {
@override
_VideoPlayerWithControlsState createState() => _VideoPlayerWithControlsState();
}
class _VideoPlayerWithControlsState extends State<VideoPlayerWithControls> {
VideoPlayerController _controller;
ChewieController _chewieController;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network(
'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
)
..initialize()
.then((_) {
setState(() {});
_createChewieController();
});
}
void _createChewieController() {
setState(() {
_chewieController = ChewieController(
_controller,
aspectRatio: _controller.value.aspectRatio,
autoPlay: false,
looping: false,
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Video Player Demo'),
),
body: Center(
child: _controller.value.isInitialized
? Chewie(
controller: _chewieController,
)
: Container(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_controller.value.isPlaying
? _controller.pause()
: _controller.play();
});
},
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
@override
void dispose() {
_controller.dispose();
_chewieController.dispose();
super.dispose();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ChangeNotifierProvider(
create: (_) => VideoPlayerController.network(
'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4',
),
child: Consumer<VideoPlayerController>(
builder: (context, controller, child) {
return VideoPlayerWithControls();
},
),
),
);
}
}
注意:
- 上述代码使用了
provider
包来管理视频控制器的状态,但在这个示例中,我们直接在VideoPlayerWithControls
中初始化了VideoPlayerController
。因此,ChangeNotifierProvider
和Consumer
的使用在这个简单示例中是多余的,你可以直接去掉它们。 - 如果你想在 Windows 上运行这个示例,确保你已经设置了 Flutter 的 Windows 开发环境。
- 由于
video_player
插件支持 Windows,上述代码在 Windows 上应该能够正常运行。
如果你确实需要使用 video_player_win
这个特定的插件(虽然它不是官方插件),你可能需要查找该插件的文档或仓库,因为它可能有自己的使用方法和API。然而,大多数情况下,官方的 video_player
插件已经足够满足需求。