如何在 Flutter 中检测视频播放器的进度(初始化/结束)?

ton*_*eki 17 flutter

我对 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)

在这里,我不确定它击中了多少秒,但对我来说效果很好。

  • 这是正确答案 (2认同)