2

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

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

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

4

2 回答 2

4

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

  • 每次在函数中使用 setTimeout,而不是 setInterval 一次。
  • 看来您将 fadeOutSound 称为 onfinish,因此没有时间淡出。
  • 从自身调用函数。

ETC

我将在这里发布一些想法,您可以以此为基础。首先,我会废弃您的方法,它既笨拙又不理想。

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

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 - 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);
    }
}

所以它现在应该淡出,但我们不想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);
}

当对声音调用 play 时,它会增加音量,并在达到 100 时取消计时器。

这应该可以帮助您度过难关。不要逐字复制这个代码,我是在分心的时候写的,更多的是作为一个指南。如果它仍然不起作用或者你不明白,请随时询问更多。

于 2012-12-29T05:03:20.147 回答
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是您希望淡入淡出持续的毫秒数。

于 2015-04-23T14:10:00.787 回答