有关as3 Sound.extract()格式的详细信息?

时间:2012-06-25 10:47:41

标签: actionscript-3 audio media

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

我希望能够将sounddata直接加载到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或其他东西)完成第二步(从光盘加载数据并提供声音对象播放)。

/ Jonas

1 个答案:

答案 0 :(得分:1)

它应该是标准的32位浮点数,每个样本每个通道一个。所以我会尝试使用sox的浮点数,但我没有尝试,但我会以一定程度的自信来做... :)浮点数是字节序独立的,我相信......