2010-08-25 1 views
3

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

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

Любая помощь будет с благодарностью получил, спасибо

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

Что делать, если во время микширования вы установите громкость звукового канала на ноль? – Eugene

+0

Thanks Eugene, Некоторые из миксов могут составлять 5 минут, я надеялся, что он сможет быстрее выполнить программу быстрее. Но да, это будет идея резервного плана. – Karatchi

ответ

0

Самый простой способ будет просто забыть о материале Pixel Bender.

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

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

Пока вы на нем, посмотрите проект Андреа Мишель в Tonfall ... Это сложное, но прекрасное место, чтобы начать с понимания входов/выходов аудио в AS3.

+0

Jeebus, не заметил, что этот вопрос был 2 года. :) – NHubben