簡體   English   中英

嘗試使用SoundManager 2循環實現淡入淡出

[英]Trying to implement cross-fade in loop with SoundManager 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);
            }
    }
});

關於如何在同一個聲音的每個過渡之間獲得交叉淡入淡出的循環的任何想法?

該方法似乎很笨拙,原因如下:

  • 每次在函數中使用setTimeout,而不是一次使用setInterval。
  • 看來您將fadeOutSound稱為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)});

但是,如果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時取消計時器。

這應該可以幫助您。 不過,不要一字接字地復制此代碼,我在分散注意力的同時寫了這本書,作為更多的指南。 隨意詢問更多是否仍然無效或您不理解。

有點晚了,但是我為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是您希望淡入淡出持續的毫秒數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM