flutter如何检测video_player的播放完成状态

在Flutter中使用video_player插件时,如何检测视频是否播放完成?我尝试监听controller的状态,但没有找到直接判断播放结束的方法。目前只能在onPositionChanged里比较duration和position,感觉不太优雅。有没有更准确的回调或事件可以监听?

2 回复

使用video_player_controlleraddListener方法监听播放状态。当value.position >= value.duration时,表示视频播放完成。

更多关于flutter如何检测video_player的播放完成状态的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,使用 video_player 插件检测视频播放完成状态,可以通过监听 VideoPlayerController 的播放位置来实现。当播放位置达到视频总时长时,表示播放完成。

以下是实现步骤和示例代码:

  1. 添加依赖:在 pubspec.yaml 中添加 video_playerchewie(可选,用于增强播放器控件)依赖。
  2. 初始化控制器:创建 VideoPlayerController 并初始化。
  3. 监听播放位置:使用 addListener 方法监听控制器状态,比较 positionduration

示例代码:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class VideoPlayerScreen extends StatefulWidget {
  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    // 初始化控制器,替换为你的视频 URL 或本地文件路径
    _controller = VideoPlayerController.network('https://example.com/sample.mp4')
      ..initialize().then((_) {
        setState(() {});
        // 开始监听
        _controller.addListener(_checkVideoCompletion);
      });
  }

  void _checkVideoCompletion() {
    if (_controller.value.position >= _controller.value.duration &&
        _controller.value.duration > Duration.zero) {
      // 播放完成后的操作,例如显示提示或跳转页面
      print('视频播放完成');
      // 可选:移除监听以避免重复触发
      _controller.removeListener(_checkVideoCompletion);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: _controller.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoPlayer(_controller),
              )
            : CircularProgressIndicator(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
                ? _controller.pause()
                : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.removeListener(_checkVideoCompletion);
    _controller.dispose();
    super.dispose();
  }
}

关键点说明

  • initState 中初始化控制器并添加监听。
  • _checkVideoCompletion 方法检查当前位置是否达到总时长,并处理完成逻辑。
  • dispose 中移除监听并释放控制器,避免内存泄漏。

使用此方法即可准确检测视频播放完成状态。

回到顶部