0

使用声音对象 .extract() 方法,可以将未压缩的声音数据作为 ByteArray 检索。提取的声音数据的格式是什么?自定义内部格式,还是既定格式?字节序类型?

我希望能够将声音数据直接加载到 byteArray 中并从该数据中播放声音(绕过下面的步骤 1)。

到目前为止,这是我的实验:

步骤 1. 这里我加载一个声音,提取数据内容并将其保存到光盘:

private var sound:Sound;
private var byteArray:ByteArray;

// loading a sound...
private function init():void {
    sound = new Sound();            
    sound.addEventListener(Event.COMPLETE, onComplete);
    sound.load(new URLRequest('short.mp3'));
}

// saving it to disc...
private function onComplete(e:Event):void {
    byteArray = new ByteArray();
    sound.extract(byteArray, 100000000);            
    byteArray.position = 0;
    var file:FileReference = new FileReference();
    file.save(byteArray, 'short.data');             
}

第 2 步。在这里,我从光盘加载数据,并使用此数据提供新声音对象的播放:

private var sound:Sound;
private var byteArray:ByteArray;

// loading a sound...
private function init():void {

    file = new FileReference();
    file.addEventListener(Event.COMPLETE, onLoaded);
    file.addEventListener(Event.SELECT, onSelected);
    file.browse();

}

private function onSelected(e:Event):void {
    file.load();
}

private function onLoaded(e:Event):void {
    trace('loaded');
    trace(file.data.length);
    byteArray = file.data;

    sound2 = new Sound();
    sound2.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);     
    sound2.play();      
}   

private function onSampleData(e:SampleDataEvent):void {
    trace(e.position);
    for (var i:int = 0; i < 2048; i++) {
        var left:Number = byteArray.readFloat();
        var right:Number = byteArray.readFloat();               
        e.data.writeFloat(left * 0.2);
        e.data.writeFloat(right * 0.2);
    }
}

我希望能够通过使用外部转换器实用程序(sox 或其他东西)来完成第二步(从光盘加载数据并提供声音对象播放)。

/乔纳斯

4

1 回答 1

1

它应该是标准的 32 位浮点数,每个样本每个通道一个。所以我会为 sox 尝试 -e 浮点数,虽然我没有尝试过,但我会带着一定的信心去做...... :) 浮点数是与字节序无关的,我相信......

于 2012-07-26T12:50:06.747 回答