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

时间:2019-08-21 05:04:20

标签: 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,
      ),
    );
  }
}

3 个答案:

答案 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 中使用它。