Программное сведение аудиодорожек (без воспроизведения)

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

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

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

person Karatchi    schedule 25.08.2010    source источник
comment
что если во время микширования вы установите громкость звукового канала на ноль?   -  person Eugene    schedule 26.08.2010
comment
Спасибо, Евгений, некоторые миксы могут быть 5 минут, я надеялся, что программно можно закончить намного быстрее. Но да, это была бы идея для резервного плана.   -  person Karatchi    schedule 26.08.2010


Ответы (1)


Самый простой способ — просто забыть о Pixel Bender.

Как только звуки загружены, используйте ENTER_FRAME, который использует Sound.extract, чтобы получить небольшой массив байтов из каждого звука, затем прочитайте все четыре извлеченных массива байтов, выполнив некоторые базовые математические операции, чтобы получить «смешанные» значения для левого и правого сигналов. Запишите эти значения в ByteArray "final/mixed/output". Повторяйте процесс в каждом кадре, пока не дойдете до конца звуков. Если звуки не все имеют одинаковую длину, вам также нужно выяснить, как с этим справиться.

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

Пока вы этим занимаетесь, ознакомьтесь с проектом Andre Michelle Tonfall... Это сложный, но отличный способ начать с понимания входов и выходов звука в AS3.

person NHubben    schedule 17.07.2012
comment
Джибус, не заметил, что этому вопросу было 2 года. :) - person NHubben; 17.07.2012