2012-06-25 54 views
0

使用聲音對象.extract()方法,可以將未壓縮的聲音數據檢索爲ByteArray。提取的聲音數據的格式是什麼?自定義內部格式或建立的格式? Endian類型?關於as3 Sound.extract()格式的詳細信息?

我希望能夠將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或其他)。

/納斯

回答

1

它應該是32位標準浮筒,每樣本通道之一。所以我會嘗試-e浮點爲sox,我雖然沒有嘗試,但我會做一定的信心...... :)浮動是endian獨立的,我相信...

+0

謝謝,Mikael!我會嘗試你的意見建議! – Cambiata