【问题标题】:How can I detect the progress(initialize/end) of video player in Flutter?如何检测 Flutter 中视频播放器的进度(初始化/结束)?
【发布时间】:2019-12-26 07:48:30
【问题描述】:

我对 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,
      ),
    );
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    在您的 videoPlayerController 中添加一个 Listener 函数,并在该函数中检查您的 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');
        }
    
      }
    } 
    

    【讨论】:

    • checkVideo() 只调用第一次。
    • 如何检测寻求变化?有什么我可以覆盖或创建监听器的吗?
    【解决方案2】:

    您可以做的是初始化 video_player 的控制器并向其添加自定义侦听器。这是sn-p。

    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);
      }
    }
    }
    

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

    【讨论】:

      【解决方案3】:

      我们也可以使用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 中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-14
        • 2019-01-14
        • 1970-01-01
        • 2021-06-28
        • 2017-02-16
        • 2020-06-04
        • 1970-01-01
        相关资源
        最近更新 更多