2011-06-10 45 views
1

所以這個代碼與它我能夠混合幾個軌道 與在像素彎曲機中完成的着色器。 這裏的問題時,混合完成或所有的聲音中游他們的最終 能夠的ByteArray保存到一個文件中的任何事件或類似的當着色器完成時檢測混合音頻

幫助PLZ東西,我不知道嗎?

package 
{ 
    import flash.display.*; 
    import flash.media.*; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.utils.*; 
    import fl.controls.Slider; 
    import org.bytearray.micrecorder.encoder.WaveEncoder; 

    [SWF(width='500', height='380', frameRate='24')] 

    public class AudioMixer extends Sprite{ 

     [Embed(source = "sound2.mp3")] private var Track1:Class;   
     [Embed(source = "sound1.mp3")] private var Track2:Class;   

     [Embed(source = "mix.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.<Slider> = new Vector.<Slider>(); 
     private var graph:Vector.<Shape> = new Vector.<Shape>(); 
     private var recBA:ByteArray = new ByteArray(); 
     private var BUFFER_SIZE:int = 0x800; 
     public var playback:Sound = new Sound(); 
     public var container:Sprite = new Sprite(); 
     public var isEvent:Boolean = false; 
     public function AudioMixer():void{ 
      container.y = stage.stageHeight * .5; 
      addChild(container); 

      sound.push(new Track1(), new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2(),new Track2()); 

      for(var i:int = 0; i < sound.length; i++){ 
       var slider:Slider = new Slider(); 
       slider.maximum = 1; 
       slider.minimum = 0; 
       slider.snapInterval = 0.025; 
       slider.value = 0.8; 
       slider.rotation += -90; 
       slider.x = i * 40 + 25; 
       container.addChild(slider); 
       sliders.push(slider); 

       var line:Shape = new Shape(); 
       line.graphics.lineStyle(1, 0x888888); 
       line.graphics.drawRect(i * 40 + 14, 0, 5, -80); 
       line.graphics.endFill(); 
       container.addChild(line); 

       var shape:Shape = new Shape();  
       shape.graphics.beginFill(0x00cc00); 
       shape.graphics.drawRect(i * 40 + 15, 0, 3, -80); 
       shape.graphics.endFill(); 
       container.addChild(shape); 
       graph.push(shape); 
      }   

      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)) * sliders[i].value;    

       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].value]; 

       graph[i].scaleY = volume; 
      } 

      var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE/1024,512); 

      shaderJob.start(true); 
      var shaderJob2:ShaderJob = new ShaderJob(shader,recBA,BUFFER_SIZE/1024,512); 
      shaderJob2.start(true); 

     }  

    } 
} 

回答

0

您可以使用ShaderEvent.COMPLETE偵聽器判斷着色器何時完成其作業。如此:

shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete); 

private function onShaderComplete(e:Event):void 
{ 
    //Do Something here 
} 

有關更多詳細信息,請參見this link

雖然你的代碼有一件事。你正在做一個sampleDataEvent中的着色器作業,我可以看到這是有問題的(可能),因爲你的混音可能與你的播放不同步(也就是說,如果你打算混合現場並寫入混合數據回到聲音流中)。無論如何,這可能是一個新問題的一個問題。這應該解決您的問題,需要知道何時混合完成。

請注意,您還需要將「false」添加到shaderJob.start(false)函數。從關於ShaderEvent.COMPLETE的文檔:

「當異步執行的ShaderJob完成使用着色器處理數據時調度。當爲waitForCompletion參數調用start()方法的false值時,ShaderJob實例異步執行「。

更新

在回答你關於詢問如何只的SampleDataEvent內部過程中,如果正處理的聲音心不是:

private var isProcessing:Boolean = false; 

private function onSoundData(event:SampleDataEvent):void { 

if(isProcessing != true){ 

      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)) * sliders[i].value;    

       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].value]; 

       graph[i].scaleY = volume; 
      } 

      var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE/1024,512); 

      shaderJob.start(false); 
shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete); 
      var shaderJob2:ShaderJob = new ShaderJob(shader,recBA,BUFFER_SIZE/1024,512); 
      shaderJob2.start(false); 

} 

     }  

private function onShaderComplete(e:ShaderEvent):void 
{ 
    //Do something here 
    isProcessing = false; 
} 
+0

謝謝我試圖在Saderevent.COMPLETE而T3沒有工作我現在會嘗試;) – 2011-06-10 16:01:18

+0

它沒有提高事件我應該在哪裏放它 – 2011-06-10 16:04:29

+0

我更新了我的答案我道歉我最初寫道Event.COMPLETE我的意思是ShaderEvent.COMPLETE。您必須將shader.start(true)更改爲shader.start(false)才能異步執行着色器,此時會觸發ShaderEvent.COMPLETE。我已經用NFO更新了答案。 – 2011-06-10 16:05:21