我对 Flutter 很陌生,对它了解不多。
我在 Flutter 中使用 video_player 和chewie 包。我想在视频开始和结束时发送分析数据。
所以,我想知道两个时间。如何检测视频开始/结束时间?
我的代码如下。
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoItem extends StatefulWidget {
final VideoPlayerController videoPlayerController;
final bool looping;
VideoItem({
@required this.videoPlayerController,
this.looping,
Key key,
}) : super(key: key);
@override
_VideoState createState() => _VideoState();
}
class _VideoState extends State<VideoItem> {
ChewieController _chewieController;
@override
void initState() {
super.initState();
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 1 / 1,
autoPlay: true,
autoInitialize: true,
looping: widget.looping,
allowFullScreen: false,
allowMuting: true,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
...
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(0.0),
child: Chewie(
controller: _chewieController,
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
Maz*_*him 21
添加一个Listener函数到您的videoPlayerController,并在该函数中检查您的当前位置VideoPlayer:
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoItem extends StatefulWidget {
final VideoPlayerController videoPlayerController;
final bool looping;
VideoItem({
@required this.videoPlayerController,
this.looping,
Key key,
}) : super(key: key);
@override
_VideoState createState() => _VideoState();
}
class _VideoState extends State<VideoItem> {
ChewieController _chewieController;
@override
void initState() {
super.initState();
widget.videoPlayerController.addListener(checkVideo);
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 1 / 1,
autoPlay: true,
autoInitialize: true,
looping: widget.looping,
allowFullScreen: false,
allowMuting: true,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
...
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(0.0),
child: Chewie(
controller: _chewieController,
),
);
}
void checkVideo(){
// Implement your calls inside these conditions' bodies :
if(videoPlayerController.value.position == Duration(seconds: 0, minutes: 0, hours: 0)) {
print('video Started');
}
if(videoPlayerController.value.position == videoPlayerController.value.duration) {
print('video Ended');
}
}
}
Run Code Online (Sandbox Code Playgroud)
raj*_*dia 11
您可以做的是初始化 video_player 的控制器并向其添加自定义侦听器。这是那个片段。
VideoPlayerController _videoController;
void _initPlayer(String s) {
try {
_videoController = VideoPlayerController.file(File(s));
_videoController.initialize().then((value) => {
_videoController.addListener(() { //custom Listner
setState(() {
if (!_videoController.value.isPlaying &&_videoController.value.initialized &&
(_videoController.value.duration ==_videoController.value.position)) { //checking the duration and position every time
//Video Completed//
setState(() {});
}
});
})
});
} catch (Exception) {
print(Exception);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我不确定它击中了多少秒,但对我来说效果很好。
| 归档时间: |
|
| 查看次数: |
9743 次 |
| 最近记录: |