gpt4 book ai didi

javascript - 尝试使用 SoundManager 2 在循环中实现交叉淡入淡出

转载 作者:行者123 更新时间:2023-11-29 18:25:26 30 4
gpt4 key购买 nike

所以我有这个应用程序,每次循环播放声音时我都需要淡入淡出效果,以便过渡流畅。

我正在使用 SoundManager 2。

更新代码:

$(document).ready(function () {
alert("Testing sound");
soundManager.flashVersion = 9;
soundManager.url = '/assets/soundmanager/swf/';
soundManager.onready(function(){
soundManager.createSound({
id:"EngineIdle",
url:"/assets/sounds/EngineIdle.ogg",
stream: true,
autoPlay: true,
multiShot: false,
volume: 0,
onplay:function() {
var fadingin = setInterval(fadein, 20);
},
onfinish:function() {
clearInterval('fadingout'); //We declared the interval as a variable earlier so we can cancel it
soundManager.play('EngineIdle');
}
});
var FadeOutTime = 2;
soundManager.onPosition('EngineIdle', FadeOutTime, function(){var fadingout = setInterval(fadeout, 20)});
});

function fadein() {
var s = soundManager.getSoundById('EngineIdle');//Again, unoptimal
if (s.volume == 100) {
clearInterval('fadingin');
return
}
s.setVolume(s.volume + 20);
}
function fadeout() {
var s = soundManager.getSoundById('EngineIdle'); //This is unoptimal to call each time, but you can fix that
if (s.volume > 0) {
s.setVolume(s.volume - 20);
}
}
});

关于如何在同一声音的每个过渡之间获得交叉淡入淡出的循环有什么想法吗?

最佳答案

这个方法看起来很笨拙,有几个原因:

  • 每次都在函数中使用 setTimeout,而不是使用一次 setInterval。
  • 看来你在完成时调用了 fadeOutSound,所以没有时间淡出。
  • 从自身调用函数。

等等

我将在此处发布一些想法,您可以在此基础上进行构建。首先,我会放弃你的方法,它笨拙且不理想。

首先,最好的循环方式是这样的:

soundManager.createSound({  
id:"EngineIdle",
url:"/assets/sounds/EngineIdle.ogg",
stream: true,
autoPlay: true,
multiShot: false,
volume: 0,
onfinish:function() {
soundManager.play(EngineIdle);
}
});

这给出了最好的循环,最少的困惑。

然后为淡出设置监听器,例如:

soundManager.onPosition('EngineIdle', FadeOutTime, function(){var fadingout = setInterval(fadeout, 20)});

在 FadeOutTime 结束之前,您希望它开始淡出。您可以使用 sound.duration - xsound.durationEstimate - x,或者如果您知道音频的长度,只需输入一个以毫秒为单位的量。

注意:soundManager.onPosition 可能比较棘手,必须在声音初始化后调用。

然后我们需要一个淡出函数

function fadeout() {
var s = soundManager.getSoundById('EngineIdle'); //This is unoptimal to call each time, but you can fix that
if (s.volume > 0) {
s.setVolume(s.volume - 20);
}
}

所以它现在应该淡出,但我们不想一直调用 fadeout,对吧?

让我们在创建声音时更改 onfinish:

onfinish:function() {
ClearInterval('fadingout'); //We declared the interval as a variable earlier so we can cancel it
soundManager.play(EngineIdle);
}

现在也淡入,当我们创建声音时添加:

onplay:function() {
var fadingin = setInterval(fadein, 20);
}

然后

function fadein() {
var s = soundManager.getSoundById('EngineIdle');//Again, unoptimal
if (s.volume === 100) {
clearInterval('fadingin');
return
}
s.setvolume(s.volume + 20);
}

在声音上调用播放时,它会增加音量,并在达到 100 时取消定时器。

这应该可以帮助您完成。不要逐字逐句地复制这段代码,我是在分心的情况下写的,更多的是作为一个指南。如果仍然不起作用或您不明白,请随时询问更多。

关于javascript - 尝试使用 SoundManager 2 在循环中实现交叉淡入淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13994649/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com