apache-flex 以编程方式混音音轨(无回放)

z18hc3ub  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(146)

我发现了一些很棒的演示,如何将声音对象混合在一起进行实时播放。
但是,它可以通过编程方式完成,而不进行任何播放,这样我就可以输出混合文件了吗?此外,我还将添加一些卷更改信息,因此它需要像播放缓冲区的工作原理一样以小块的形式添加。

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

klr1opcd1#

最简单的方法是忘记Pixel Bender的事情。
一旦加载了声音,就使用一个ENTER_FRAME,它使用Sound.extract从每个声音中获取一个较小的ByteArray,然后读取所有四个提取的ByteArrays,通过一些基本的数学运算得出左右信号的“混合”值。将这些值写入“final/mixed/output”ByteArray。在每一帧重复此过程,直到声音结束。如果声音“t都是相同的长度,您还需要弄清楚如何处理它。
如果您需要执行混音,其中每个轨道的振幅随时间变化,这将是一个很好的挑战,但需要时间来设置。
当你在做的时候,看看Andre Michelle的Tonfall项目...这是一个复杂但很好的地方,可以从了解AS 3中音频的细节开始。

相关问题