尝试使用SoundManager 2实现交叉淡入循环

时间:2012-12-21 17:34:43

标签: javascript audio soundmanager2

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

我正在使用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);
            }
    }
});

关于如何在相同声音的每次转换之间获得交叉渐变的循环的任何想法?

2 个答案:

答案 0 :(得分:4)

这种方法看起来很笨拙,原因如下:

  • 每次在函数中使用setTimeout,而不是setInterval一次。
  • 你似乎把fadeOutSound称为ffin,因此没有时间淡出。
  • 从自身调用函数。

我会在这里发布一些你可以构建的想法。首先我废弃你的方法,这是笨拙和不理想的。

首先,循环的最佳方式是:

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

这给出了最好的循环,杂乱最少。

然后为你的fadeout设置一个监听器,例如:

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: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时取消定时器。

这应该可以帮到你。不要一字不漏地复制这个代码,我分散注意力,并且作为更多的指南。如果它仍然不起作用或者你不理解,请随意询问更多。

答案 1 :(得分:0)

有点晚了,但我为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);
    }

这将运行50次,每次增加音频音量2%。

time是您希望淡入淡出持续的毫秒数。