javascript
  • audio
  • soundmanager2
  • 2012-12-21 64 views 2 likes 
    2

    所以我有這個應用程序,每當我循環播放我的聲音時都需要淡入淡出效果,以便轉換順暢。試圖在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); 
          } 
        } 
    }); 
    

    我如何能得到每個過渡之間的交叉衰落上相同的聲音循環的任何想法?

    回答

    4

    這種方法看起來很笨拙,有幾個原因:

    • 的功能,每次使用的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 - 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); 
    } 
    

    當聲音被調用時,它會增加音量,並在達到100時取消定時器。

    這應該會幫助你通過。儘管不要複製這些代碼,但我在分心的時候寫下了這個代碼,並且更多的是指導。如果它仍然不起作用或者你不明白,請隨時問。

    +0

    謝謝,我會在幾天內對它進行測試,並讓您知道它是怎麼回事 – psychok7

    +0

    我更新了上面的代碼並更改了您的更改。它運作得好一點,但仍然沒有「平穩」的預期效果。你能幫忙嗎? – psychok7

    +0

    爲了更平滑,我只是讓時間不同,所以它開始更快地消失,並漸漸變慢。如果你把我的音頻文件夾到我身邊,看看我能不能找到它更好 –

    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是您希望淡化持續的毫秒數。

    相關問題