静音/取消静音声音w/o按钮HTML5



问题:在HTML5中自动为静音和取消静音音频(w/o VideoPlayer)找到一个有效的函数,直到定义的时间过去。

我将振荡器的增益设置为从0逐渐增加到1(在每个增益单位的增加中都会有1秒的静音),直到达到30秒。为此,调用了setValueAtTime函数(我为增益和时间值都添加了增量)。

然而,这似乎并不有效,因为迭代没有遵循准确的真实生活对应时间,即使参数被单独设置为在特定时间内更改值->这需要进行伪测试。更有趣的是setValueCurveAtTimesetLinearRampAtTime但它们似乎不允许在音调增加期间分布"静音"。

发现的唯一引用是带有自定义按钮的UserInteraction,这不是自动的;和JQuery函数。我找不到足够精确的文件。例如,函数"document.getElementById(id).setVolume(0);"既没有提供定义静音持续时间的选项,也没有提供在音调增加的30秒内均匀插入这1秒静音的选项。

一旦定义了函数,我就会调用setTimeout,使其立即播放,然后调用setInterval("function()",30000)。

代码段

context=new AudioContext();
var oscillator = context.createOscillator();
var gainR = context.createGain(); 
oscillator.connect(gainR);
gainR.connect(context.destination);
gainR.gain.setValueAtTime(0,currenttime);
loudnessup = function (){
var c = currenttime;
var Loud=0.2; 
gainR.gain.setValueAtTime(Loud, c+2);
gainR.gain.setValueAtTime(0, c+3);
gainR.gain.setValueAtTime(Loud+0.05, c+3.5);
gainR.gain.setValueAtTime(0, c+4.5);
//...continues iterations
gainR.gain.setValueAtTime(Loud+0.8, c+28);
gainR.gain.setValueAtTime(0, c+30);};
setTimeout("loudnessup()",currenttime); 
setInterval(function(){
n=n+1; //after 30s the freq value should arise accordingly to an array 
oscillator.frequency.value = frequencies[n];},30000);}

30秒后,带有更高频率的环路似乎不会进一步

下面是一个使用内置高分辨率计时器设置相对于开始时间的短段音量的示例。

它将为每个分段创建两个事件,以快速增加音量。每个分段都是切换的,所以第一次它将增大音量,第二次它将减小音量。使用轻微的斜坡也可以防止声音中的咔嗒声。

使用切换状态,可以创建两个事件,为每个分段定义一个短渐变。如果切换为true,If将从当前音量变为0,否则从0变为当前音量:

var toggle = true;
var now = actx.currentTime;
...
for(var i = 0; i < duration; i += step) {
var volume = i / duration;
g.gain.linearRampToValueAtTime(toggle ? volume : 0, now + i);
g.gain.linearRampToValueAtTime(toggle ? 0 : volume, now + i + 0.012);
toggle = !toggle;
}

活生生的例子

document.querySelector("button").onclick = function() {
this.style.display = "none";
playSound();                     // first play
setInterval(playSound, 30000);   // next play, after and every 30 sec.
};

function playSound() {

var duration = 30, step = 1, toggle = false,
actx = new (AudioContext || webkitAudioContext)(),
osc = actx.createOscillator(),
g = actx.createGain();
osc.frequency.value = 440;
g.gain.value = 0;
osc.connect(g); 
g.connect(actx.destination);
var now = actx.currentTime;
for(var i = 0; i < duration; i += step) {
// volume for this segment when toggled on
var volume = i / duration;

// create a short ramp using two events 12ms appart
g.gain.linearRampToValueAtTime(toggle ? volume : 0, now + i);
g.gain.linearRampToValueAtTime(toggle ? 0 : volume, now + i + 0.012);
toggle = !toggle;
}
osc.start();
osc.stop(now + duration);
};
button {font:bold 20px sans-serif}
<button>Start</button>

最新更新