b站有些视频音量设为100%时,不够响,可以用AudioContext API进行突破限制
/**
* 带平滑过渡的增益控制
* @param {HTMLMediaElement} mediaElement - video/audio 元素
* @param {number} gainValue - 目标增益值
* @param {number} duration - 过渡时间(秒),默认 0.1秒
*/
async function adjustMediaGainSmooth(mediaElement, gainValue, duration = 0.1) {
const targetGain = Math.max(0, Math.min(20, gainValue));
if (!mediaElement._audioCtx) {
const AudioContext = window.AudioContext || window.webkitAudioContext;
mediaElement._audioCtx = new AudioContext();
mediaElement._gainNode = mediaElement._audioCtx.createGain();
mediaElement._source = mediaElement._audioCtx.createMediaElementSource(mediaElement);
mediaElement._source.connect(mediaElement._gainNode);
mediaElement._gainNode.connect(mediaElement._audioCtx.destination);
}
if (mediaElement._audioCtx.state === 'suspended') {
await mediaElement._audioCtx.resume();
}
const now = mediaElement._audioCtx.currentTime;
const currentGain = mediaElement._gainNode.gain.value;
// 取消之前的调度,从当前值平滑过渡到目标值
mediaElement._gainNode.gain.cancelScheduledValues(now);
mediaElement._gainNode.gain.setValueAtTime(currentGain, now);
mediaElement._gainNode.gain.linearRampToValueAtTime(targetGain, now + duration);
return targetGain;
}
// 使用:1秒内平滑过渡到 10 倍音量
await adjustMediaGainSmooth(document.querySelector("#bilibili-player video"), 20, 1.0);
/**
* 带平滑过渡的增益控制
* @param {HTMLMediaElement} mediaElement - video/audio 元素
* @param {number} gainValue - 目标增益值
* @param {number} duration - 过渡时间(秒),默认 0.1秒
*/
async function adjustMediaGainSmooth(mediaElement, gainValue, duration = 0.1) {
const targetGain = Math.max(0, Math.min(20, gainValue));
if (!mediaElement._audioCtx) {
const AudioContext = window.AudioContext || window.webkitAudioContext;
mediaElement._audioCtx = new AudioContext();
mediaElement._gainNode = mediaElement._audioCtx.createGain();
mediaElement._source = mediaElement._audioCtx.createMediaElementSource(mediaElement);
mediaElement._source.connect(mediaElement._gainNode);
mediaElement._gainNode.connect(mediaElement._audioCtx.destination);
}
if (mediaElement._audioCtx.state === 'suspended') {
await mediaElement._audioCtx.resume();
}
const now = mediaElement._audioCtx.currentTime;
const currentGain = mediaElement._gainNode.gain.value;
// 取消之前的调度,从当前值平滑过渡到目标值
mediaElement._gainNode.gain.cancelScheduledValues(now);
mediaElement._gainNode.gain.setValueAtTime(currentGain, now);
mediaElement._gainNode.gain.linearRampToValueAtTime(targetGain, now + duration);
return targetGain;
}
// 使用:1秒内平滑过渡到 10 倍音量
await adjustMediaGainSmooth(document.querySelector("#bilibili-player video"), 20, 1.0);