2012-06-25 25 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