Apache flex 以编程方式合成音频曲目(无播放)

Apache flex 以编程方式合成音频曲目(无播放),apache-flex,flash,actionscript-3,audio,pixel-bender,Apache Flex,Flash,Actionscript 3,Audio,Pixel Bender,我发现了一些关于如何将声音对象混合在一起进行实时播放的优秀演示。请参阅下面的工作示例 但是它可以在没有任何回放的情况下以编程方式完成,这样我就可以输出混合文件了吗?此外,我还将添加一些音量变化信息,因此需要将其分小块添加,如播放缓冲区的工作方式 [Embed(source = "audio/track01.mp3")] private var Track1:Class; [Embed(source = "audio/track02.mp3")] private var Trac

我发现了一些关于如何将声音对象混合在一起进行实时播放的优秀演示。请参阅下面的工作示例

但是它可以在没有任何回放的情况下以编程方式完成,这样我就可以输出混合文件了吗?此外,我还将添加一些音量变化信息,因此需要将其分小块添加,如播放缓冲区的工作方式

[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);
}       
[Embed(source=“audio/track01.mp3”)]
私有变量Track1:类;
[Embed(source=“audio/track02.mp3”)]
私有var Track2:类;
[Embed(source=“audio/track03.mp3”)]
私有var Track3:类;
[Embed(source=“audio/track04.mp3”)]
私有var Track4:类;[Embed(source=“AudioMixerFilter2.pbj”,mimeType=“application/octet-stream”)]
私有变量:类;
私有变量着色器:着色器=新着色器(新嵌入着色器());
私人var声音:矢量新向量();
专用变量字节:向量=新向量();
专用var滑块:矢量新向量();
私有变量sliderVol:int=1;
私有变量缓冲区大小:int=0x800;
公共变量播放:声音=新声音();
公共函数startAudioMixer(事件:FlexEvent):无效{
sound.push(新轨迹1(),新轨迹2(),新轨迹3(),新轨迹4());
滑块。推送(滑块,滑块,滑块,滑块);
回放.addEventListener(SampleDataEvent.SAMPLE_数据,onSoundData);
playback.play();
}
onSoundData的私有函数(事件:SampleDataEvent):void{
for(变量i:int=0;i
最简单的方法就是忘记像素弯曲器

加载声音后,使用一个使用Sound.extract的ENTER_帧从每个声音中获取一个较小的ByteArray,然后通读所有四个提取的ByteArray,进行一些基本的数学运算,以获得左右信号的“混合”值。将这些值写入teArray的“final/mixed/output”。在每一帧重复这个过程,直到声音结束。如果声音的长度不尽相同,你也需要弄清楚如何处理

如果你需要在每个音轨的振幅随时间变化的情况下进行混音,这将是一个很好的挑战,但需要时间来设置


当你这么做的时候,看看安德烈·米歇尔的《今秋》节目。。。从理解AS3中音频的输入/输出开始,这是一个很复杂但很好的地方。

如果在混音过程中将声道的音量设置为零,会怎么样?感谢Eugene,有些混音可能长达5分钟,我曾希望它能够以编程方式更快地完成。但是,是的,这将是一个备份计划的想法。Jeebus,没有注意到这个问题是2岁的时候