1

所以这个代码我可以将几个轨道与在像素弯曲器中完成的着色器混合。这里的问题我不知道混合何时完成或所有声音都到达终点才能将字节数组保存到任何事件或类似的文件中

帮助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);

        }       

    }
}
4

1 回答 1

0

您可以使用 ShaderEvent.COMPLETE 侦听器判断着色器何时完成其工作。像这样:

shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete);

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

有关更多详细信息,请参阅此链接

不过,关于您的代码的一件事。您正在 sampleDataEvent 中执行此着色器工作,我可以看到这是有问题的(可能),因为您的混音可能与您的播放不同步(也就是说,如果您计划实时混音并编写混合数据回到声音流中)。无论如何,这可能是一个新问题的问题。这应该可以解决您需要知道混合何时完成的问题。

请注意,您还需要在 shaderJob.start(false) 函数中添加“false”。从有关 ShaderEvent.COMPLETE 的文档中:

“当异步执行的 ShaderJob 完成使用着色器处理数据时调度。当使用 waitForCompletion 参数的 false 值调用 start() 方法时,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;
}
于 2011-06-10T15:57:19.890 回答