自动挂机看知到MOOC,支持屏蔽弹窗题目、自动切换下一节,章测试和考试支持自动答题,视频自动倍速播放、线路选择、默认静音等,解除各类功能限制,开放自定义参数
@Skeleton321 说道: 限制视频挂机时长的功能,问题:1.5倍速下实际播放时长远超设置的时长。
注意:限制视频挂机时长的功能设定的参数,与播放速度无关,只是计时功能,且有一定的限制,即循环计时区间内,视频为播放状态才会计入统计时间。(切换视频不影响计时功能)
请不要混淆视频播放在进度条和实际时间上去的区别,前者为视频进度,后者为实际时间。脚本的计时功能是基于后者的实际时间,而不是进度条上的时间,进度条上的时间受视频倍速影响。
再来说一下你的代码,先将代码格式化:
var lastCache = {
duration: 0,
currentTime: 0,
debug: 0 // 打开debug功能,会在控制台显示剩余时间。
};
function remainingTime() {
var duration = self.PlayerStarter.playerArray[0].player.cache.duration;
var currentTime = self.PlayerStarter.playerArray[0].player.cache.currentTime;
if (lastCache.duration == 0) {
lastCache.duration = duration;
lastCache.currentTime = currentTime;
}
var delta = currentTime - lastCache.currentTime;
if (delta < 0) {
// delta = setting.time * setting.speed / 1E3;
delta = lastCache.duration - lastCache.currentTime;
if (delta > 1) {
delta -= setting.time * setting.speed / 1E3 - currentTime; // 这个if不加应该也行,只是为了计时更精确
}
delta += currentTime;
lastCache.duration = duration;
}
setting.habit -= delta;
lastCache.currentTime = currentTime;
if (lastCache.debug == 1) {
var out_time = Math.round(setting.habit * 1E3);
console.log("剩余时间: " + parseInt(out_time / 6E4) + ":" + parseInt(out_time % 6E4 / 1E3) + ":" + parseInt(out_time % 1E3));
}
}
代码第14行,delta
值的产生,可以理解为你在取进度条上的播放进度。
代码第15~23行,可以理解为切换视频后,进行的处理。
代码第15行的判断,有明显的BUG,delta < 0
也可能是由于手动向前拖动了进度条,导致当前进度小于上次的进度值。这会直接导致计时出现极大的偏差。
基于对你的代码分析,你可能是想在倍速的情况下,计时进度条的时间进度。如果要实现此功能,可以简单修改脚本即可。
// 脚本原代码
setting.habit -= player.paused() ? 0 : setting.time;
// 修改后的代码
setting.habit -= player.paused() ? 0 : setting.time * setting.speed;
第15行原本是判断是否开始播放后续的视频,手动拖动进度条的问题确实没有考虑到,直接判断视频url可能会更好? 除此之外,我还遇到其他的问题,例如一个15分钟的视频,在1.5倍速下本应该10分钟看完,但网页版可能只看了9分钟或更短的时间,平台就认为看完了这个视频,且学习记录中统计的时间为15分钟。这个可能是个个例。综合来看,直接统计播放时间的效果可能会更好。
关于"限制视频挂机时长"功能计时不准确的修复办法
脚本用了挺久了,最近才注意到有个限制视频挂机时长的功能。但是这个功能有点问题:1.5倍速下实际播放时长远超设置的时长。下面是我个人研究后找到的解决方案。 1.添加 var lastCache = { duration: 0.0, currentTime: 0.0, debug = 0 //打开debug功能,会在控制台显示剩余时间。 }; 2.添加函数 function remainingTime(){ var duration = self.PlayerStarter.playerArray[0].player.cache.duration; var currentTime = self.PlayerStarter.playerArray[0].player.cache.currentTime; if(lastCache.duration == 0){ lastCache.duration = duration; lastCache.currentTime = currentTime; } var delta = currentTime - lastCache.currentTime; if(delta < 0){ //delta = setting.time * setting.speed / 1E3; delta = lastCache.duration - lastCache.currentTime; if(delta > 1){ delta -= setting.time * setting.speed / 1E3 - currentTime; //这个if不加应该也行,只是为了计时更精确 } delta += currentTime; lastCache.duration = duration; } setting.habit -= delta; lastCache.currentTime = currentTime; if(lastCache.debug == 1){ var out_time = Math.round(setting.habit * 1E3); console.log("剩余时间: " + parseInt(out_time / 6E4) + ":" + parseInt(out_time % 6E4 / 1E3) + ":" + parseInt(out_time % 1E3)); } } 3.修改totalTime()函数 将 setting.habit -= player.paused() ? 0 : setting.time; 替换为 remainingTime(); 4.修改habit参数为你想要设定的时长,单位为分钟。建议稍微多设置一点。 不知道为什么设置不了代码格式,就这样吧: ( 希望作者能看到。