如何计算视频播放时间区间数组中的唯一播放时长(秒)
计算用户播放视频的唯一有效秒数方案
这问题我之前做视频播放统计的时候碰到过,核心思路就是合并所有重叠或相邻的播放区间,然后计算合并后所有区间的总时长就行,具体步骤和代码实现给你整理好了:
核心步骤
- 首先对播放记录数组按
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
相关产品推荐
相关产品推荐

