2011-06-10 56 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