Определите, когда шейдер завершил микширование аудио - PullRequest
1 голос
/ 10 июня 2011

так что код с ним я могу смешать несколько треков с шейдером, сделанным в пиксельном загибе. проблема здесь, я не знаю, когда закончится микширование или весь звук повторяет их конец чтобы иметь возможность сохранить байтовый массив в файл любого события или что-то в этом роде

помогите плз?

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

        }       

    }
}

1 Ответ

0 голосов
/ 10 июня 2011

Вы можете узнать, когда шейдер завершил свою работу, с помощью слушателя ShaderEvent.COMPLETE.Вот так:

shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete);

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

См. эту ссылку для получения более подробной информации.

Одна вещь о вашем коде, хотя.Вы выполняете эту шейдерную работу внутри sampleDataEvent, и я вижу, что это проблематично (возможно) в том смысле, что ваше микширование может быть не синхронизировано с вашим воспроизведением (то есть, если вы планируете микширование в реальном времени и запись смешанных данныхобратно в звуковой поток).Во всяком случае, это, возможно, проблема для нового вопроса.Это должно решить вашу проблему с необходимостью знать, когда микширование завершено.

Обратите внимание, что вам также необходимо добавить «false» в функцию shaderJob.start (false).Из документации о ShaderEvent.COMPLETE:

"Отправляется, когда ShaderJob, который выполняется асинхронно, завершает обработку данных с помощью шейдера. Экземпляр ShaderJob выполняется асинхронно, когда вызывается метод start () с ложным значением дляПараметр waitForCompletion. "

Обновление

В ответ на ваш запрос о том, как обрабатывать только в 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;
}
...