2010-08-25 76 views
3

我發現了一些優秀的演示,說明如何將聲音對象混合在一起進行實況播放。看到下面的工作示例...編程式混音音軌(無播放)

但它可以編程方式完成沒有任何回放,所以我可以只輸出混合文件?另外,我會一路添加一些音量更改信息,因此需要像播放緩衝區的工作方式那樣以小塊添加。

任何幫助將受到歡迎,感謝

[Embed(source = "audio/track01.mp3")] 
private var Track1:Class;  
[Embed(source = "audio/track02.mp3")] 
private var Track2:Class;  
[Embed(source = "audio/track03.mp3")] 
private var Track3:Class; 
[Embed(source = "audio/track04.mp3")] 
private var Track4:Class;[Embed(source = "AudioMixerFilter2.pbj",mimeType = "application/octet-stream")] 
private var EmbedShader:Class; 

private var shader:Shader = new Shader(new EmbedShader()); 

private var sound:Vector.<Sound> = new Vector.<Sound>();  
private var bytes:Vector.<ByteArray> = new Vector.<ByteArray>(); 
private var sliders:Vector.<Number> = new Vector.<Number>(); 

private var sliderVol:int = 1; 

private var BUFFER_SIZE:int = 0x800; 

public var playback:Sound = new Sound(); 

public function startAudioMixer(event:FlexEvent):void{ 


    sound.push(new Track1(), new Track2(), new Track3(), new Track4()); 
    sliders.push(sliderVol,sliderVol,sliderVol,sliderVol); 

    playback.addEventListener(SampleDataEvent.SAMPLE_DATA, onSoundData); 
    playback.play(); 
} 

private function onSoundData(event:SampleDataEvent):void { 

    for(var i:int = 0; i < sound.length; i++){ 
     bytes[i] = new ByteArray(); 
     bytes[i].length = BUFFER_SIZE * 4 * 2; 
     sound[i].extract(bytes[i], BUFFER_SIZE);     

     var volume:Number = 0; 
     bytes[i].position = 0; 

     for(var j:int = 0; j < BUFFER_SIZE; j++){ 
      volume += Math.abs(bytes[i].readFloat()); 
      volume += Math.abs(bytes[i].readFloat());     
     } 



     volume = (volume/(BUFFER_SIZE * .5)) * sliderVol; // SLIDER VOL WILL CHANGE  

     shader.data['track' + (i + 1)].width = BUFFER_SIZE/1024; 
     shader.data['track' + (i + 1)].height = 512; 
     shader.data['track' + (i + 1)].input = bytes[i]; 
     shader.data['vol' + (i + 1)].value = [sliders[i]]; 

    } 

    var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE/1024,512); 
    shaderJob.start(true); 
}  
+0

如果在混音過程中您將聲道的音量設置爲零? – Eugene 2010-08-26 05:41:05

+0

感謝尤金, 一些混合可能是5分鐘長,我希望它可能能夠以更快的編程完成。但是,這是一個備份計劃的想法。 – Karatchi 2010-08-26 07:46:41

回答

0

最簡單的方法是隻忘了Pixel Bender的東西。

聲音加載完成後,使用ENTER_FRAME使用Sound.extract從每個聲音中獲取一個小小的ByteArray,然後讀取所有四個提取的ByteArrays,做一些基本的數學運算以得到左邊的'mixed'值&正確的信號。將這些值寫入「最終/混合/輸出」ByteArray。重複每一幀的過程,直到聲音結束。如果聲音的長度不完全相同,則需要弄清楚如何處理。

如果您需要執行混合,每個軌道的振幅隨時間而變化,這將是一個很好的挑戰,但需要一定的時間來設置。

當你在這裏,看看安德烈米歇爾的Tonfall項目......這是一個複雜但很好的地方,從理解AS3音頻的輸入/輸出開始。

+0

Jeebus,沒注意到這個問題是2歲。 :) – NHubben 2012-07-17 19:41:40