2014-07-18 22 views

回答

0

如果你不需要以二進制格式輸出混音,只需雙重播放即可。

track1.play(); 
track2.play(); 

是的,因爲你的軌道是在ByteArray對象,首先提出兩個Sound對象,並通過loadPCMDataFromByteArray()得到的ByteArray數據。

UPDATE:因爲你根本不想回放,最簡單的混合兩條軌道的方法是讀取每個ByteArray中的一個浮點數,然後將它們的平均值寫入ByteArray結果中。使用ENTER_FRAME偵聽器是值得的,如果你不想讓SWF在轉換過程中失速。你說你的數組長度相等的,如果是的話,下面的代碼片段應該做的wav文件的你「簡單組合」:

var f1:Number; 
var f2:Number; 
b1.position=0; 
b2.position=0; 
var result:ByteArray=new ByteArray(); 
var l:int=b1.length; // cache property 
var i:int=0; 
while (i<l) { 
    i=i+4; // size of float 
    f1=b1.readFloat(); 
    f2=b2.readFloat(); 
    result.writeFloat(0.5*f1+0.5*f2); 
} 

做一個enterFrame事件方法需要您result是監聽通話之間可用,位置不變,在循環中運行一個臨時計數器,該計數器將控制「在此幀中進行足夠的轉換」。就像這樣:

var result:ByteArray; 
var tracks:Vector.<ByteArray>=[]; 
var mixFinished:Function; // a callback 
function startMixing():void { 
    // just make it start mixing 
    for (var i:int=tracks.length;i>=0;i--) tracks[i].position=0; 
    addEventListener(Event.ENTER_FRAME,doMixing); 
    result=new ByteArray(); 
} 
function doMixing(e:Event):void { 
    if (tracks.length==0) { 
     removeEventListener(Event.ENTER_FRAME,doMixing); 
     return; 
    } // sanity check 
    var mixrate:Number=1.0/tracks.length; 
    for (var i:int=0;i<2048;i++) { // adjust number accordingly 
     var tm:int=0; // how many tracks mixed 
     var f:int=0; 
     for (var j:int=tracks.length-1;j>=0;j--) { 
      if (tracks[j].position<tracks[j].length) { 
       // this track isn't finished 
       tm++; 
       f+=tracks[j].readFloat(); 
      } 
     } 
     if (tm==0) { // all tracks reached end, stop mixing 
      removeEventListener(Event.ENTER_FRAME,doMixing); 
      if (mixFinished!=null) mixFinished(); // do a callback 
      return; 
     } 
     result.writeFloat(f*mixrate); 
    } 
} 

有了這個,你填tracks,建立mixFinished並調用startMixing,然後等到mixFinished會被調用,到那時你的聲音應適當混合。如果你覺得你的混音過程應該更快,那麼適當地增加代碼中的2048值。

+0

感謝您的回答,但我想生成一個wav文件沒有任何回放。 – JackLin

+0

好的,看到更新的答案。 – Vesper

+0

它完美地解決了我的問題,謝謝Versper! – JackLin