You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在better_player或video_player中实现特定时间触发回调?

实现BetterPlayer精确时间点回调(Cue Points)

问题分析

你通过BetterPlayerEventType.progress事件监听视频进度,但该事件的回调间隔不稳定(如你给出的2611、3209ms这类间隔),无法满足精确触发特定时间点回调的需求。这是因为底层video_player的进度事件本身基于帧率或固定间隔触发,并非精准到每毫秒。

解决方案

可以自行封装精准时间点检测逻辑,结合progress事件,每次进度回调时检查是否命中预设时间点,同时避免重复触发。

步骤1:封装时间点管理类

创建一个类来管理需要触发的时间点,处理触发状态:

class CuePointManager {
  final List<int> _cuePoints;
  final List<int> _triggeredPoints = [];
  final Function(int) onCuePointHit;

  CuePointManager(this._cuePoints, this.onCuePointHit);

  void checkProgress(int currentMs) {
    for (final point in _cuePoints) {
      if (!_triggeredPoints.contains(point) && currentMs >= point) {
        onCuePointHit(point);
        _triggeredPoints.add(point);
      }
    }
  }

  // 重置已触发记录(用于视频重播场景)
  void reset() {
    _triggeredPoints.clear();
  }
}

步骤2:结合BetterPlayer使用

在播放器初始化代码中实例化管理器,在进度事件中调用检测方法:

// 预设需要触发的时间点(单位:毫秒)
final cuePoints = [3000, 5000, 8000];
late CuePointManager _cueManager;

@override
void initState() {
  super.initState();
  _cueManager = CuePointManager(cuePoints, (point) {
    // 处理时间点命中后的业务逻辑
    print('触发时间点:$point ms');
  });

  // 监听BetterPlayer进度事件
  betterPlayerController.addEventsListener((event) {
    if (event.betterPlayerEventType == BetterPlayerEventType.progress) {
      final currentMs = event.parameters!['progress']!.inMilliseconds;
      _cueManager.checkProgress(currentMs);
    }
  });
}

// 视频重播时重置管理器
void replayVideo() {
  _cueManager.reset();
  betterPlayerController.seekTo(Duration.zero);
  betterPlayerController.play();
}

精度优化技巧

如果觉得progress事件间隔过大,可通过以下方式优化:

  • 调整进度更新频率:在BetterPlayerConfiguration中设置updateInterval: Duration(milliseconds: 50),让进度回调更频繁。
  • 增加误差区间:修改checkProgress的判断条件为currentMs >= point - 50 && currentMs <= point + 50,避免因进度跳变错过时间点。

补充说明

BetterPlayer基于video_player封装,而原生video_player仅提供基础播放控制能力,这类业务级的时间点触发逻辑通常需要上层自行实现——毕竟不同场景对精度、重复触发的处理需求存在差异。

内容的提问来源于stack exchange,提问作者Guy Luz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:15:10