我对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,
),
);
}
}
答案 0 :(得分:2)
在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(videoController.value.position == Duration(seconds: 0, minutes: 0, hours: 0)){
print('video Started');
}
if(videoController.value.position == videoController.value.duration)){
print('video Ended');
}
}
}
答案 1 :(得分:0)
您可以做的是初始化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);
}
}
}
我不确定它能击中多少秒,但对我来说效果很好。
答案 2 :(得分:0)
我们可以使用 flutter_hooks
:
@override
Widget build(BuildContext context) {
final VideoPlayerController _videoPlayerController =
VideoPlayerController.network(dataSource);
final ValueNotifier<bool> _isVideoFinished = useState(false);
useEffect(() {
void checkIsFinished() {
_isVideoFinished.value = _videoPlayerController.value.isInitialized &&
_videoPlayerController.value.position ==
_videoPlayerController.value.duration;
}
_videoPlayerController.addListener(checkIsFinished);
return () {
_videoPlayerController.removeListener(checkIsFinished);
};
}, <VideoPlayerController>[_videoPlayerController]);
return Scaffold(
resizeToAvoidBottomInset: false,
body: IntroductionScreen(
pages: <PageViewModel>[
PageViewModel(
title: "",
image: VideoItem(
videoPlayerController: _videoPlayerController,
autoPlay: true,
),
body: "",
decoration: const PageDecoration(fullScreen: true),
),
],
done: const Text("Done", style: TextStyle(fontWeight: FontWeight.w600)),
showDoneButton: _isVideoFinished.value,
onDone: onDone,
showNextButton: false,
),
);
}
不要忘记在 HookWidget
中使用它。