Javascript 尝试使用SoundManager 2实现交叉淡入循环
因此,我有这个应用程序,我需要有一个淡入淡出效果,每次我循环我的声音,使过渡运行平稳 我正在使用SoundManager 2 更新代码:Javascript 尝试使用SoundManager 2实现交叉淡入循环,javascript,audio,soundmanager2,Javascript,Audio,Soundmanager2,因此,我有这个应用程序,我需要有一个淡入淡出效果,每次我循环我的声音,使过渡运行平稳 我正在使用SoundManager 2 更新代码: $(document).ready(function () { alert("Testing sound"); soundManager.flashVersion = 9; soundManager.url = '/assets/soundmanager/swf/'; soundManager.onready(funct
$(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
- 看起来你把淡出声音叫做onfinish,所以没有时间淡出
- 从函数本身调用函数
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)});
这将提供最好的循环,最少的混乱
然后为淡出设置一个侦听器,类似于:
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)});
在淡出时间是多久之前结束,你希望它开始褪色。您可以使用sound.duration-x
,sound.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);
}
}
所以它现在应该淡出,但我们不想永远调用淡出,是吗
让我们在创建声音时更改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时取消计时器
这将帮助你度过难关。不过,不要逐字复制这个代码,我在心烦意乱的时候写的,更像是一个指南。如果仍然不起作用或您不明白,请随时询问更多信息。这种方法似乎相当笨拙,原因如下:
- 每次在函数中使用setTimeout,而不是一次使用setInterval
- 看起来你把淡出声音叫做onfinish,所以没有时间淡出
- 从函数本身调用函数
等
我会在这里发布一些想法,你可以从中借鉴。首先我要放弃你的方法,它既笨拙又不理想
首先,循环的最佳方式如下:
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)});
这将提供最好的循环,最少的混乱
然后为淡出设置一个侦听器,类似于:
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)});
在淡出时间是多久之前结束,你希望它开始褪色。您可以使用sound.duration-x
,sound.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);
}
}
所以它现在应该淡出,但我们不想永远调用淡出,是吗
让我们在创建声音时更改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时取消计时器
这将帮助你度过难关。不过,不要逐字复制这个代码,我在心烦意乱的时候写的,更像是一个指南。如果仍然不起作用或者您不明白,请随时询问更多信息。有点晚了,但我为Soundmanager音频对象实现了一个基本的淡入淡出循环
this.fadeAudio = function(audio_out, audio_in, time, callback) {
audio_in.setVolume(0); //Ensuring silent incoming audio
audio_in.play();
vol_inc = (time / audio_out.volume) * 2;
loop = setInterval(function(){
if(audio_out.volume <= 0) {
audio_out.setPosition(audio_out.duration); // Manually finishing song
callback();
clearInterval(loop);
}
audio_out.setVolume(audio_out.volume - 2);
audio_in.setVolume(audio_in.volume + 2);
}, vol_inc);
}
this.fadeudio=函数(音频输出、音频输入、时间、回调){
音频_in.setVolume(0);//确保静音传入音频
音频输入播放();
音量=时间/音频输出音量)*2;
循环=设置间隔(函数(){
if(audio_out.volume有点晚,但我为Soundmanager音频对象实现了一个基本的淡入淡出循环
this.fadeAudio = function(audio_out, audio_in, time, callback) {
audio_in.setVolume(0); //Ensuring silent incoming audio
audio_in.play();
vol_inc = (time / audio_out.volume) * 2;
loop = setInterval(function(){
if(audio_out.volume <= 0) {
audio_out.setPosition(audio_out.duration); // Manually finishing song
callback();
clearInterval(loop);
}
audio_out.setVolume(audio_out.volume - 2);
audio_in.setVolume(audio_in.volume + 2);
}, vol_inc);
}
this.fadeudio=函数(音频输出、音频输入、时间、回调){
音频_in.setVolume(0);//确保静音传入音频
音频输入播放();
音量=时间/音频输出音量)*2;
循环=设置间隔(函数(){
如果(audio_out.volume)谢谢,我会在几天后测试它,让你知道它是如何用你的更改更新我上面的代码的。它工作得稍微好一点,但仍然没有“平滑”想要的效果。你能帮我吗?为了更流畅,我会让时间不同,所以它开始淡出得更快,淡出得更慢。如果你把音频文件扔给我,我会弄得一团糟,看看我能不能把它弄得更好,你可以在这里下载声音,尽管我正在寻找一种更通用的方法,让用户可以上传自己的声音,一个d他们可以在一个通用算法上顺利循环HMI将为yathanks测试一些东西,我将在几天后测试它,并让你知道它是如何用你的更改更新我上面的代码的。它工作得更好一些,但仍然没有“平滑”想要的效果。你能帮我吗?为了更流畅,我会让时间不同,所以它开始淡出得更快,淡出得更慢。如果你把音频文件扔给我,我会弄得一团糟,看看我能不能把它弄得更好,你可以在这里下载声音,尽管我正在寻找一种更通用的方法,让用户可以上传自己的声音,一个他们可以在一个通用算法上流畅地循环。我会为你测试一些东西