簡體   English   中英

AS3播放音頻之間的不必要延遲

[英]AS3 unwanted delay between playing audio

我有一首歌分為四首:前奏,A,B,結尾。 我有一個播放簡介的程序,然后兩次A,然后兩次B,然后再次回到A,並不斷重復AABB,直到按下結束按鈕。 如果按下結束按鈕,則結束當前播放的樂曲,播放結束並停止。 它的工作原理就像一種魅力,只是在樂曲之間的過渡上有一個非常明顯的刺激性延遲。 如何擺脫延遲並在上一首曲目結束后立即播放歌曲? (我在Flash CS6中使用的是ActionScript 3.0,歌曲為mp3格式,已導入到庫中)。 這是程序: https : //dl.dropboxusercontent.com/s/6f9w906x9uja683/Loop%20music%20test.swf這是我正在使用的代碼:

import flash.events.MouseEvent;

stop();
//variables
var track_var: Number = 0;
var music_cnl:SoundChannel = new SoundChannel();
var intro_msc:Sound = new intro_mp3();
var a_msc:Sound = new A_mp3();
var b_msc:Sound = new B_mp3();
var outro_msc:Sound = new ending_mp3();
//stopping the movieclips
a_mc.stop();
b_mc.stop();
ending_btn.stop();

//intro
music_cnl = intro_msc.play();
track_var= 1;
intro_mc.gotoAndStop(2);
music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
trace("debug:track value set to",track_var);

//track selector
function playnext_fn(event:Event){
    trace("debug:playnext_fn called");
    switch(track_var){
        case 0:
            //stop
            music_cnl.stop();
            intro_mc.gotoAndStop(1);
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            ending_btn.gotoAndStop(1);
            trace("debug:track value set to",track_var);
            ending_btn.removeEventListener(MouseEvent.MOUSE_UP, ending_fn);
        break;
        case 1:
            //first A track
            track_var=2;
            intro_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            a_mc.gotoAndStop(2);
            music_cnl= a_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn)
            trace("debug:track value set to",track_var);
        break;
        case 2:
            //second A track
            track_var=3;
            music_cnl= a_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 3:
            //first B track
            track_var = 4
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(2);
            music_cnl= b_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 4: 
            //second B track
            track_var=1;
            music_cnl= b_msc.play();
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;
        case 5:
            //ending
            a_mc.gotoAndStop(1);
            b_mc.gotoAndStop(1);
            intro_mc.gotoAndStop(1);
            ending_btn.gotoAndStop(2);
            music_cnl=outro_msc.play();
            track_var=0;
            music_cnl.addEventListener(Event.SOUND_COMPLETE, playnext_fn);
            trace("debug:track value set to",track_var);
        break;

    }
}

//ending button
ending_btn.addEventListener(MouseEvent.MOUSE_UP, ending_fn);
function ending_fn(Event:MouseEvent){
    track_var=5;
    ending_btn.gotoAndStop(2)
    trace("debug: ending button pressed|","track value set to",track_var);
}

我看不到您的代碼有問題(除了有關MAX_BUFFERSIZE的冗余和不正確的語法外,但我認為這看起來像是試圖解決問題的殘余!)

我認為最可能造成此問題的是您的源音頻-如果將其作為MP3導入,或者以48比特率導入,則可能會導致同步問題。

無論是從庫,從外部加載,mp3,wav,任何咬合速率,使用傳統的Sound對象都無法擺脫延遲。 Flash Sound API的設計很差,播放聲音時不可避免地會有延遲。

但是,根據您的情況,您可能會希望通過使用SampleEventData並將其混合在一起來擺脫它。 初始延遲可能長達1000毫秒,但是在您的情況下,這可能是無關緊要的,因為聲音之間的同步更為重要:

http://help.adobe.com/zh_CN/as3/dev/WSE523B839-C626-4983-B9C0-07CF1A087ED7.html

以任何方式播放Flash中的聲音時,延遲時間(開始播放聲音所需的時間)可能從60毫秒變為400毫秒,具體取決於系統。 推薦的行業標准是30ms,這使得Flash在任何與聲音相關的應用中都是過時的技術。

暫無
暫無

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

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