AS3でwavファイルを読み込みます。
URLLoaderでバイナリ形式で読み込んで、ByteArrayでデータをいじっていきます。
とりあえず、今回はヘッダ部分を読み込み。
手元の適当なwavファイルを読み込んでみました。
ヘッダを読み込んで出力してるだけです。
こんな感じで出力されます。
----------------- RIFF Chunk ----------------- Total size of this file is 1919070 bytes . File type is WAVE . ----------------- FMT Chunk ----------------- Size of FMT Chunk is 16 bytes. Format ID is 1 (1 is Linear PCM). Channel is 1 ( 1 : mono 2 : stereo). Sampling rate is 16000 Hz. Data Speed is 32000 ( Sampling rate × Block size ). Block size is 2 ( Channel × Quantization bit rate / 8). Quantization bit rate is 16 . ----------------- DATA Chunk ----------------- Size of DATA Chunk is 1918976 bytes.
以下ソースです。
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.ByteArray;
import flash.utils.Endian;
public class read_wav01 extends Sprite
{
public function read_wav01()
{
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
var loader:URLLoader=new URLLoader;
loader.dataFormat=URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("data.wav"));
}
private function onComplete(e:Event):void
{
var loader:URLLoader=e.target as URLLoader;
loader.removeEventListener(Event.COMPLETE, onComplete);
var data:ByteArray=ByteArray(loader.data);
data.endian=Endian.LITTLE_ENDIAN;
data.position=0;
// wavファイルを読み込んでいく
var isLoop:Boolean=true;
var tf:TextField=new TextField;
tf.autoSize=TextFieldAutoSize.LEFT;
tf.scaleX=tf.scaleY=2;
tf.x=tf.y=5;
addChild(tf);
// 周波数データを保存するByteArray
var waveData:ByteArray=new ByteArray;
waveData.endian=Endian.LITTLE_ENDIAN;
waveData.position=0;
// ヘッダのデータの表示・dataチャンクを読み込むまで続ける
while(isLoop)
{
var chunk_type:String=data.readUTFBytes(4);
switch(chunk_type)
{
case "RIFF":
tf.appendText("----------------- RIFF Chunk -----------------\n");
tf.appendText("Total size of this file is " + (data.readUnsignedInt() + 8) + " bytes .\n");
tf.appendText("File type is " + data.readUTFBytes(4) + " .\n\n");
break;
case "fmt ":
var pos:uint=data.position;
var size:uint=data.readUnsignedInt();
tf.appendText("----------------- FMT Chunk -----------------\n");
tf.appendText("Size of FMT Chunk is " + size + " bytes.\n");
tf.appendText("Format ID is " + data.readUnsignedShort() + " (1 is Linear PCM).\n");
tf.appendText("Channel is " + data.readUnsignedShort() + " ( 1 : mono 2 : stereo).\n");
tf.appendText("Sampling rate is " + data.readUnsignedInt() + " Hz.\n");
tf.appendText("Data Speed is " + data.readUnsignedInt() + " ( Sampling rate × Block size ).\n");
tf.appendText("Block size is " + data.readUnsignedShort() + " ( Channel × Quantization bit rate / 8).\n");
tf.appendText("Quantization bit rate is " + data.readUnsignedShort() + " .\n\n");
data.position=pos + size;
break;
case "data":
tf.appendText("----------------- DATA Chunk -----------------\n");
var dataLength:uint=data.readUnsignedInt();
tf.appendText("Size of DATA Chunk is " + dataLength + " bytes.\n");
data.readBytes(waveData, 0, dataLength);
isLoop=false;
break;
}
}
}
}
}