2011-09-09 41 views
0

我使用2個聲道同時播放2個獨立的外部加載的mp3文件。現在我有一個播放按鈕綁定到一個功能,開始第一個MP3,然後是第二個。問題是 - 第二個mp3會在第一個幾毫秒後開始。有沒有一種方法可以確保這兩款遊戲在同一時間開始玩?動作 - 同步2聲道?

function playMusic(evt:MouseEvent):void 
{ 

    channel = myMusic.play(songPosition); 
    channel2 = myMusic2.play(songPosition); 
    myTimer.start(); 
    btnPlay.mouseEnabled = false; 
} 

編輯:我發現了一個笨拙的解決方法,匹配2個音源的TIMER。它的工作原理,但現在我必須在一開始就打嗝,而我試圖匹配:

function updateTime(evt:TimerEvent):void 
    { 
     lblSongTime.text = convertTime(channel.position); 
     if(channel.position!=channel2.position){ 
trace("out of sync")     
SoundMixer.stopAll() 
    channel = myMusic.play(); 
    channel2 = myMusic2.play(channel.position); 

     } 
    } 
+0

您是否嘗試過使用'channel.position',而不是'songPosition'當您最初調用'myMusic2.play'? – jswolf19

+0

是的,昨天晚上我在嘗試修復時試了一下。仍然開始不同步。我認爲它必須是一個動作錯誤。任何幫助你可以給予不勝感激。 – user547794

+0

好的,我相信在一開始就擺脫了這個故障。在playMusic功能中,我將兩個通道的音量設置爲0.然後在同步校正之後,我將音量恢復。笨拙的,但工作,我想? – user547794

回答

2

如果你針對Flash Player的10+,那麼你可以使用sampleData event和聲音類的extract method要結合兩個聲音。

基本上,您需要製作Sound子類,通過將位置傳遞給要播放的兩個聲音中的每一個的extract方法來處理sampleData事件。然後,您將結合兩個ByteArrays並將其插入事件的data成員中。

需要注意的主要問題是,一次只能給sampleData事件提供最多8K的數據(如果我沒記錯的話)。您也可能想要對這兩個聲音進行平均,或者至少在合併聲音時減小音量。

自從我寫了actionscript之後已經有一段時間了,所以我花了一點時間爲你寫一些代碼,但是如果你仍然需要幫助,請告訴我,我會嘗試給你更多的信息或一些代碼。

編輯

這裏有一個最小的類,它會做你想要什麼。您應該添加錯誤檢查,您可能需要添加東西來處理聲音轉換(例如音量調整),因爲使用示例數據事件可能會忽略您在播放時應用的聲音轉換(我不記得,但它不應該太你很難找出答案^ _ ^)...

import flash.events.SampleDataEvent; 
import flash.media.Sound; 
import flash.utils.ByteArray; 

public class DualSound extends Sound { 
    private var sa:Sound; 
    private var sb:Sound; 

    public function DualSound(a:Sound, b:Sound) { 
     super(); 

     sa = a; 
     sb = b; 

     addEventListener(SampleDataEvent.SAMPLE_DATA, handleSampleData); 
    } 

    private function handleSampleData(e:SampleDataEvent):void { 
     var ba:ByteArray, bb:ByteArray; 

     ba = new ByteArray(); 
     bb = new ByteArray(); 

     sa.extract(ba, 8 << 10, e.position); 
     sb.extract(bb, 8 << 10, e.position); 
     ba.position = 0; 
     bb.position = 0; 

     while(ba.bytesAvailable > 0 && bb.bytesAvailable > 0) { 
      e.data.writeFloat((ba.readFloat() + bb.readFloat())/2); 
     } 
     if(ba.bytesAvailable > 0) { 
      e.data.writeBytes(ba, ba.position, ba.bytesAvailable); 
     } else if(bb.bytesAvailable > 0) { 
      e.data.writeBytes(bb, bb.position, bb.bytesAvailable); 
     } 
    } 
} 
+0

我不完全清楚你在說什麼。我確實發現了一個非常笨拙的工作 - 基本上它會檢查audio2的TIMER是否與audio1的TIMER匹配。問題是現在,它跳過用於第二擊中發揮後而它試圖匹配: \t功能註冊(EVT:TimerEvent):無效 \t { \t \t lblSongTime.text = convertTime(channel.position); \t \t \t 如果\t { 跡( 「不同步」) SoundMixer.stopAll() \t信道= myMusic.play()(channel.position = channel2.position!); \t channel2 = myMusic2.play(channel。位置); \t \t} \t} – user547794

+0

@user,我已經添加了一個類的代碼,如果您對解決方法不滿意,它會根據需要進行操作。 – jswolf19