【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)
实际发布时间:2022-12-14 22:54:52。
csdn禁止浏览器脚本相关博客了,就只能重新发到这儿了。
2024/12/14更新:更新了常见问题Q&A,可以配合食用。
只要浏览器播放视频时用的是<video>
,而且当前页面只有这一个视频,就可以用这个脚本。
这是我很久以前为了倍速看MOOC视频,所以写的一个脚本,一直没有专门写博客去介绍它。刚刚,我想倍速看新闻联播,才发现忘记写博客了。
浏览器视频倍速播放的原理非常容易,我也是看了一下网页源代码才发现的。自从发现了这一点之后,我连本地视频都特别喜欢直接用浏览器播放。
脚本链接
Greasy Fork 链接:https://greasyfork.org/zh-CN/scripts/449828-任意视频倍速播放。
注:如果你的浏览器有可以运行 JS 脚本的扩展插件,那么点击即可安装。
脚本功能
PC端,任意浏览器视频倍速播放,按键调速。
其实除了倍速播放,还有调进度、调音量的功能。这是因为我觉得挺方便,就一块儿加上了。
功能清单
① +/-0.25倍速:按w/s键;
② 切换整数倍速:按1/2/3/4键;
③ +/-0.5s:按→/←键;
④ +/-10%音量:按↑/↓键。
以上键位均可配置,其中整数倍数我喜欢更高的倍数所以我也额外令它可以配置了。配置菜单如下:
注意事项
注:目前测试了mooc、新闻联播网站、b站视频、本地视频,都可以,如果有不可以的网站请反馈给我。
注:用浏览器播放本地视频,需要将扩展插件设置为“允许访问文件URL”。
部分网站的备注如下:
- b站:视频的w是投币,要么改快捷键,要么全屏之后才可以调倍速;
- 有倍速检测的网站:自行判断是否适合采用本脚本,本脚本带来的风险概不负责,如国家中小学智慧教育平台部分视频有倍速检测
- 百度网盘:百度网盘会自己锁定倍速,调了它会立马改回去,所以本脚本不适用。
脚本代码
// ==UserScript==
// @name 任意视频倍速播放
// @namespace http://tampermonkey.net/
// @version 0.5.3
// @description 任意浏览器视频倍速播放,按键调速。
// @author shandianchengzi
// @include *
// @icon data:image/png;base64,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
// @license GPL3
// @grant GM_registerMenuCommand
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
// 默认按键配置
const DEFAULT_KEYS = {
speedUp: 'w',
speedDown: 's',
forward: 'ArrowRight',
backward: 'ArrowLeft',
volumeUp: 'ArrowUp',
volumeDown: 'ArrowDown',
normalSpeed: '1',
doubleSpeed: '2',
tripleSpeed: '3',
quadrupleSpeed: '4',
speedList: {
normalSpeed: 1.0,
doubleSpeed: 2.0,
tripleSpeed: 3.0,
quadrupleSpeed: 4.0
}
};
const JS_name = "VIDEOSPEED_keys";
// 获取配置
function getConfig() {
const savedKeys = GM_getValue(JS_name);
return savedKeys ? {...DEFAULT_KEYS, ...savedKeys} : DEFAULT_KEYS;
}
// 轻提醒
function Toast(msg, duration) {
duration = isNaN(duration) ? 3000 : duration;
var m = document.createElement('div');
m.innerHTML = msg;
m.style.cssText = "font-family:siyuan;max-width:60%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
document.body.appendChild(m);
setTimeout(function() {
var d = 0.5;
m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
m.style.opacity = '0';
setTimeout(function() {
document.body.removeChild(m)
}, d * 1000);
}, duration);
}
// 配置快捷键
function configureShortcuts() {
const keys = getConfig();
const configWindow = document.createElement('div');
configWindow.style.position = 'fixed';
configWindow.style.top = '50%';
configWindow.style.left = '50%';
configWindow.style.transform = 'translate(-50%, -50%)';
configWindow.style.backgroundColor = '#fff';
configWindow.style.padding = '20px';
configWindow.style.border = '1px solid #ddd';
configWindow.style.borderRadius = '8px';
configWindow.style.boxShadow = '0 6px 12px rgba(0, 0, 0, 0.3)';
configWindow.style.zIndex = '10000';
configWindow.style.width = '500px';
configWindow.style.maxHeight = '80vh';
configWindow.style.overflowY = 'auto';
configWindow.style.fontFamily = 'Arial, sans-serif';
// 创建表单内容
let formHTML = `
<h3 style="margin-top: 0; font-size: 18px; color: #333; border-bottom: 1px solid #eee; padding-bottom: 10px;">
配置快捷键
</h3>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
`;
// 添加快捷键输入字段
const keyLabels = {
speedUp: '加速键 (默认: w)',
speedDown: '减速键 (默认: s)',
forward: '前进5秒键 (默认: →)',
backward: '后退5秒键 (默认: ←)',
volumeUp: '增加音量键 (默认: ↑)',
volumeDown: '降低音量键 (默认: ↓)'
};
const speedLabels = {
normalSpeed: '倍速键 (默认: 1)',
doubleSpeed: '倍速键 (默认: 2)',
tripleSpeed: '倍速键 (默认: 3)',
quadrupleSpeed: '倍速键 (默认: 4)'
};
for (const [key, label] of Object.entries(keyLabels)) {
formHTML += `
<label style="font-size: 14px; display: block; margin-bottom: 5px;">
${label}
<input type="text" id="${key}" value="${keys[key] || ''}"
style="width: 100%; padding: 5px; margin-top: 2px; border: 1px solid #ccc; border-radius: 4px;">
</label>
`;
}
for (const [key, label] of Object.entries(speedLabels)) {
formHTML += `
<label style="font-size: 14px; display: block; margin-bottom: 5px;">
<input type="text" id="${key}_value" value="${keys['speedList'][key] || ''}" style="width: 10%; padding: 5px; margin-top: 2px; border: 1px solid #ccc; border-radius: 4px;">
${label}
<input type="text" id="${key}" value="${keys[key] || ''}"
style="width: 100%; padding: 5px; margin-top: 2px; border: 1px solid #ccc; border-radius: 4px;">
</label>
`;
}
formHTML += `
</div>
<p>倍速调节范围:0.1~16<br>具体的键位与名称的对应关系可以查询:https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/code</p>
<div style="text-align: right; margin-top: 20px; border-top: 1px solid #eee; padding-top: 15px;">
<button id="saveShortcuts" style="padding: 8px 16px; margin-right: 10px; background-color: #4CAF50;
color: white; border: none; border-radius: 4px; cursor: pointer;">保存</button>
<button id="cancelShortcuts" style="padding: 8px 16px; background-color: #f44336;
color: white; border: none; border-radius: 4px; cursor: pointer;">取消</button>
</div>
`;
configWindow.innerHTML = formHTML;
document.body.appendChild(configWindow);
// 添加事件监听器
document.getElementById('saveShortcuts').addEventListener('click', () => {
const newKeys = {...keys};
const newSpeedList = {...keys.speedList};
// 更新普通按键
for (const key of Object.keys(keyLabels)) {
newKeys[key] = document.getElementById(key).value.trim() || DEFAULT_KEYS[key];
}
// 更新速度按键和对应的速度值
for (const key of Object.keys(speedLabels)) {
newKeys[key] = document.getElementById(key).value.trim() || DEFAULT_KEYS[key];
const speedValue = parseFloat(document.getElementById(`${key}_value`).value);
newSpeedList[key] = isNaN(speedValue) ? DEFAULT_KEYS.speedList[key] : speedValue;
}
newKeys.speedList = newSpeedList;
GM_setValue(JS_name, newKeys);
document.body.removeChild(configWindow);
Toast('快捷键配置已保存,刷新页面后生效', 2000);
});
document.getElementById('cancelShortcuts').addEventListener('click', () => {
document.body.removeChild(configWindow);
});
// 添加ESC键关闭功能
const closeOnEsc = (e) => {
if (e.key === 'Escape') {
document.body.removeChild(configWindow);
document.removeEventListener('keydown', closeOnEsc);
}
};
document.addEventListener('keydown', closeOnEsc);
}
// 显示当前配置
function showCurrentConfig() {
const keys = getConfig();
const configText = `
当前快捷键配置:
加速: ${keys.speedUp}
减速: ${keys.speedDown}
前进5秒: ${keys.forward}
后退5秒: ${keys.backward}
增加音量: ${keys.volumeUp}
降低音量: ${keys.volumeDown}
${keys.speedList.normalSpeed}倍速: ${keys.normalSpeed}
${keys.speedList.doubleSpeed}倍速: ${keys.doubleSpeed}
${keys.speedList.tripleSpeed}倍速: ${keys.tripleSpeed}
${keys.speedList.quadrupleSpeed}倍速: ${keys.quadrupleSpeed}
`.trim();
alert(configText);
}
// 重置为默认配置
function resetToDefault() {
if (confirm('确定要重置为默认快捷键配置吗?')) {
GM_setValue(JS_name, DEFAULT_KEYS);
Toast('已重置为默认配置,刷新页面后生效', 2000);
}
}
async function mainFunc(){
const keys = getConfig();
document.body.onkeydown = function(ev) {
var e = ev || event;
// 避免短时间重复触发同一按键
this.lastKey = this.lastKey || '';
this.lastTime = this.lastTime || 0;
if(this.lastKey === e.key) {
if((new Date()).getTime() - this.lastTime < 100) {
return;
}
}
this.lastKey = e.key;
this.lastTime = (new Date()).getTime();
let video = document.getElementsByTagName('video')[0];
if(video){
switch(e.key){
case keys.speedUp: // 加速
video.playbackRate += 0.25;
Toast(video.playbackRate.toFixed(2), 100);
break;
case keys.speedDown: // 减速
video.playbackRate -= 0.25;
Toast(video.playbackRate.toFixed(2), 100);
break;
case keys.forward: // 前进5秒
video.currentTime += 5;
break;
case keys.backward: // 后退5秒
video.currentTime -= 5;
break;
case keys.volumeUp: // 增加音量
video.volume = Math.min(video.volume + 0.1, 1);
Toast(video.volume.toFixed(1), 100);
break;
case keys.volumeDown: // 降低音量
video.volume = Math.max(video.volume - 0.1, 0);
Toast(video.volume.toFixed(1), 100);
break;
case keys.normalSpeed: // 正常速度
video.playbackRate = keys.speedList.normalSpeed;
Toast(video.playbackRate.toFixed(1), 100);
break;
case keys.doubleSpeed: // 2倍速
video.playbackRate = keys.speedList.doubleSpeed;
Toast(video.playbackRate.toFixed(1), 100);
break;
case keys.tripleSpeed: // 3倍速
video.playbackRate = keys.speedList.tripleSpeed;
Toast(video.playbackRate.toFixed(1), 100);
break;
case keys.quadrupleSpeed: // 4倍速
video.playbackRate = keys.speedList.quadrupleSpeed;
Toast(video.playbackRate.toFixed(1), 100);
break;
default:
return;
}
}
}
}
// 注册菜单命令
GM_registerMenuCommand('配置快捷键', configureShortcuts);
GM_registerMenuCommand('查看当前配置', showCurrentConfig);
GM_registerMenuCommand('重置为默认配置', resetToDefault);
(function() {
'use strict';
window.onhashchange=mainFunc;
mainFunc();
// 这个代码不管用,会导致所有的都运行不了。建议编辑脚本,设置-通用-仅在顶层页面(框架)运行-是
// if(window.top === window.self){
// }
})();
2025/10/15更新掉了,不再用keyCode了,所以以下内容废弃:
注意,如需修改脚本的快捷键,别用ASCII码表。
这个脚本的代码和按键的对应关系是用KeyCode
码表,常用键码值如下图:
对照表 - 一个工具箱
查看:http://www.atoolbox.net/Tool.php?Id=815。
最新配置方法如下:
如需修改脚本的快捷键,点击插件、找到对应脚本,然后点配置快捷键就可以了:
我提供的配置项在前面的脚本功能中介绍过了。
脚本原理
原理究极无敌简单,就是修改video
这个DOM元素的playbackRate
或其他属性。
唯一体现了一点点难度的,可能就只是调整之后弹出来的Toast
轻提醒,如下:
我今天上号发现安装量还挺不错的~!说明蛮多人都有按键播放需求。所以来补一个博客,引一下流(bushi)。
脚本建议
由于视频通常加载在页面的顶层框架,没有必要在其他层加载,为了防止脚本执行次数过多,建议编辑脚本并设置,使之仅仅运行在顶层框架上。
第一步,打开编辑面板:
第二步,设置-通用-仅在顶层页面(框架)运行-是:
脚本Q&A
2024/12/14更新
2025/10/15再次更新
脚本失效了怎么办?
请对照以下原因调整。
0 浏览器开发者模式没有打开
所有的油猴脚本执行都需要打开浏览器的开发者模式。如下图所示,下图为开启的状态:
1 版本原因
我有时的更新会导致脚本不可用,如果真的导致了不可用,请立即在Github Issue中提出,或者通过博客园发送私信反馈给我,我会快速修复或者回退,在Greasyfork留言我可能查看不及时。
你现在可以考虑更新到最新版本试一试问题是否仍然存在,如果仍然存在,你可以考虑退回到0.4或以前的版本,对于这种功能简单的脚本,越原始往往意味着越稳定。
2 网站原因
大部分网站我都测试过,除了百度网盘我明确测试了它具备反倍速修改的功能、并且目前尚未绕过之外,其他的网站如b站、爱奇艺都是可以改倍速的。若有其他不支持的网站,请直接在Github Issue中提出,如果有空我会帮忙测试是否真的不可用,如果真的不可用我会找时间做兼容适配。
3 热键占用
其他插件或脚本占用了wasd这几个按键则无法调倍速。
4 环境原因
若你的运行环境不在电脑上,而是在平板或手机上。我现在还没有测试过平板的功能支持性,所以可能平板上会有不兼容的情况。
抽时间我会对我的安卓和苹果平板都做一下测试并兼容,改好后我会更新这里的说明。
手机我很少用来运行脚本,因此不考虑做手机视频倍速的兼容适配。
5 窗口锚点
如果你的运行环境在电脑上,请确保你的窗口锚点落在浏览器窗口内,意思是确定你当前操作的界面是你要调速的界面。为了确保这一点,你可以在使用脚本功能之前,关闭画中画,点击视频暂停再点击播放,再按下wasd键进行调速。
6 运行失败
若你的运行环境在电脑上,可以打开浏览器的开发者工具并切换到控制台选项卡,按下wasd这些键盘后控制台中应该会显示test输出,如果显示了说明脚本被正常执行了,如果没有显示则会出现相应的报错,将报错截图通过Github Issue发给我,或者通过博客园发送私信。
其他问题
如果有其他问题,请在Github Issue中提出,或者通过博客园发送私信,这样我会有邮件提醒。
如果后续代码有更新,我会优先更新 Github 里的代码,所以最新代码请直接查看 Github 仓库。转载或修改请标明出处:https://greasyfork.org/zh-CN/scripts/449828-任意视频倍速播放。