Flutter视频缓存播放插件video_cached_player的使用
Flutter视频缓存播放插件video_cached_player的使用
video_cached_player
是一个 Flutter 插件,它基于官方的 video_player
包进行修改,支持在 Android 和 iOS 上进行视频缓存。Web 端的插件则与官方的 video_player
类似,不支持缓存。
为什么 fork
- 原始创建者停止了更新和合并 PR,所以我重新发布了它。
- 我认为 exo player 2.12 被下架了,导致我的构建失败。因此,我在 Android 上无法继续使用
implementation 'com.google.android.exoplayer:exoplayer-core:2.12.1'
,而是更新到了implementation 'com.google.android.exoplayer:exoplayer-core:2.18.1'
。 - 清除了过时的方法。
- 修复了错误。
- 遵循了
video_player
包的指导。
安装
首先,在你的 pubspec.yaml
文件中添加 video_cached_player
作为依赖项。
然后,遵循官方 video_player
包的 Android 和 iOS 配置步骤。该插件在桌面端不可用。
问题
maxFileSize
和maxCacheSize
在 Android 上分别被硬编码为 100 MiB 和 1 GiB。
贡献者
示例代码
以下是一个完整的示例,展示了如何使用 video_cached_player
插件来缓存并播放视频。
import 'package:flutter/material.dart';
import 'package:video_cached_player/video_cached_player.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// 这个小部件是你的应用的根。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// 这是你应用的主题。
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
// 这个小部件是你的应用的主页。它是有状态的,意味着它有一个包含影响其外观的字段的状态对象。
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late final CachedVideoPlayerController controller =
CachedVideoPlayerController.network(
"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
formatHint: VideoFormat.other,
videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
);
[@override](/user/override)
void initState() {
super.initState();
_initializeController(controller);
}
Future<void> _initializeController(CachedVideoPlayerController controller) async {
await controller.initialize().then((value) {
controller.play();
});
if (mounted) {
setState(() {});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
// 这个方法会在每次调用 setState 时重新运行,就像上面的 _incrementCounter 方法一样。
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: controller.value.isInitialized
? AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: CachedVideoPlayer(controller))
: const CircularProgressIndicator()),
);
}
[@override](/user/override)
void dispose() {
controller.dispose();
super.dispose();
}
}
更多关于Flutter视频缓存播放插件video_cached_player的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频缓存播放插件video_cached_player的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
video_cached_player
是一个用于 Flutter 的视频播放插件,它支持视频缓存功能,可以在视频播放时缓存视频数据,从而提升用户体验。以下是如何使用 video_cached_player
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 video_cached_player
插件的依赖:
dependencies:
flutter:
sdk: flutter
video_cached_player: ^0.1.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在需要使用 video_cached_player
的 Dart 文件中导入插件:
import 'package:video_cached_player/video_cached_player.dart';
3. 初始化播放器
在使用 VideoCachedPlayer
之前,你需要初始化它。通常在 initState
方法中进行初始化:
class MyVideoPlayer extends StatefulWidget {
[@override](/user/override)
_MyVideoPlayerState createState() => _MyVideoPlayerState();
}
class _MyVideoPlayerState extends State<MyVideoPlayer> {
VideoCachedPlayerController _controller;
[@override](/user/override)
void initState() {
super.initState();
_controller = VideoCachedPlayerController(
url: 'https://www.example.com/sample.mp4', // 视频的URL
cacheConfig: CacheConfig(
maxCacheSize: 100 * 1024 * 1024, // 最大缓存大小,单位是字节
maxCacheFileCount: 10, // 最大缓存文件数量
),
)..initialize().then((_) {
setState(() {});
});
}
[@override](/user/override)
void dispose() {
_controller.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Cached Video Player'),
),
body: Center(
child: _controller.value.isInitialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoCachedPlayer(_controller),
)
: CircularProgressIndicator(),
),
);
}
}
4. 控制视频播放
你可以使用 VideoCachedPlayerController
来控制视频的播放、暂停、停止等操作。例如:
// 播放视频
_controller.play();
// 暂停视频
_controller.pause();
// 停止视频
_controller.stop();
// 跳转到指定时间
_controller.seekTo(Duration(seconds: 10));
// 设置音量
_controller.setVolume(0.5);
// 设置播放速度
_controller.setPlaybackSpeed(1.5);
5. 处理视频状态
你可以监听视频的播放状态、缓冲状态等。例如:
_controller.addListener(() {
if (_controller.value.isPlaying) {
// 视频正在播放
} else if (_controller.value.isBuffering) {
// 视频正在缓冲
} else if (_controller.value.isCompleted) {
// 视频播放完成
}
});
6. 清理缓存
你可以手动清理缓存:
VideoCachedPlayer.clearCache();
7. 其他配置
video_cached_player
还支持其他一些配置,例如设置缓存目录、自定义缓存策略等。你可以根据需要进行配置。
8. 处理错误
在使用过程中,可能会遇到一些错误,例如网络错误、视频格式不支持等。你可以通过监听 _controller
的 error
属性来处理这些错误。
_controller.addListener(() {
if (_controller.value.hasError) {
// 处理错误
print(_controller.value.errorDescription);
}
});
9. 完整示例
以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:video_cached_player/video_cached_player.dart';
class MyVideoPlayer extends StatefulWidget {
[@override](/user/override)
_MyVideoPlayerState createState() => _MyVideoPlayerState();
}
class _MyVideoPlayerState extends State<MyVideoPlayer> {
VideoCachedPlayerController _controller;
[@override](/user/override)
void initState() {
super.initState();
_controller = VideoCachedPlayerController(
url: 'https://www.example.com/sample.mp4',
cacheConfig: CacheConfig(
maxCacheSize: 100 * 1024 * 1024,
maxCacheFileCount: 10,
),
)..initialize().then((_) {
setState(() {});
});
}
[@override](/user/override)
void dispose() {
_controller.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Cached Video Player'),
),
body: Center(
child: _controller.value.isInitialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoCachedPlayer(_controller),
)
: CircularProgressIndicator(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_controller.value.isPlaying
? _controller.pause()
: _controller.play();
});
},
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
);
}
}
void main() => runApp(MaterialApp(
home: MyVideoPlayer(),
));