Javascript 尝试使用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

因此,我有这个应用程序,我需要有一个淡入淡出效果,每次我循环我的声音,使过渡运行平稳

我正在使用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
  • 看起来你把淡出声音叫做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测试一些东西,我将在几天后测试它,并让你知道它是如何用你的更改更新我上面的代码的。它工作得更好一些,但仍然没有“平滑”想要的效果。你能帮我吗?为了更流畅,我会让时间不同,所以它开始淡出得更快,淡出得更慢。如果你把音频文件扔给我,我会弄得一团糟,看看我能不能把它弄得更好,你可以在这里下载声音,尽管我正在寻找一种更通用的方法,让用户可以上传自己的声音,一个他们可以在一个通用算法上流畅地循环。我会为你测试一些东西