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

如何计算视频播放时间区间数组中的唯一播放时长(秒)

计算用户播放视频的唯一有效秒数方案

这问题我之前做视频播放统计的时候碰到过,核心思路就是合并所有重叠或相邻的播放区间,然后计算合并后所有区间的总时长就行,具体步骤和代码实现给你整理好了:

核心步骤

  • 首先对播放记录数组按beginPosition从小到大排序,这样能保证我们按时间顺序处理区间,方便后续合并
  • 初始化一个空的合并区间数组,把第一个播放区间先放进去(如果数组不为空的话)
  • 遍历剩下的每个播放区间:
    • 拿当前区间和合并数组里的最后一个区间对比
    • 如果当前区间的beginPosition <= 最后一个区间的endPosition,说明两个区间有重叠或者相邻,这时候更新最后一个区间的endPosition为两者endPosition的最大值(把重叠部分合并成一个连续区间)
    • 如果没有重叠,就把当前区间直接加入合并数组
  • 最后遍历合并后的区间数组,把每个区间的endPosition - beginPosition相加,得到的就是唯一有效播放秒数

JavaScript代码实现

function calculateUniquePlaybackSeconds(playbackArray) {
  // 处理空数组的边界情况
  if (!playbackArray || playbackArray.length === 0) return 0;

  // 复制原数组并按起始位置排序,避免修改原数据
  const sortedPlaybacks = [...playbackArray].sort((a, b) => a.beginPosition - b.beginPosition);

  // 初始化合并区间数组
  const mergedIntervals = [sortedPlaybacks[0]];

  // 遍历剩余区间进行合并
  for (let i = 1; i < sortedPlaybacks.length; i++) {
    const current = sortedPlaybacks[i];
    const lastMerged = mergedIntervals[mergedIntervals.length - 1];

    if (current.beginPosition <= lastMerged.endPosition) {
      // 重叠或相邻,更新合并区间的结束位置
      lastMerged.endPosition = Math.max(lastMerged.endPosition, current.endPosition);
    } else {
      // 无重叠,直接加入合并数组
      mergedIntervals.push(current);
    }
  }

  // 计算合并后所有区间的总时长
  return mergedIntervals.reduce((total, interval) => {
    return total + (interval.endPosition - interval.beginPosition);
  }, 0);
}

// 测试示例
const playbackArray = [
  { beginPosition: 0, endPosition: 30, blockNum: 0 },
  { beginPosition: 45, endPosition: 65, blockNum: 1 },
  { beginPosition: 25, endPosition: 50, blockNum: 2 } // 加入一个重叠区间
];

console.log(calculateUniquePlaybackSeconds(playbackArray)); // 输出65,合并后为[0-65],总时长65秒

额外说明

  • 代码里用了数组展开语法[...playbackArray]复制原数组,避免修改传入的原始数据,这是开发里的常规好习惯
  • 如果需要按blockNum分组计算每个区块的唯一播放时长,只需要先按blockNum对原数组分组,再对每个分组调用这个函数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:02:59