AS3でwavファイル読み込み

Filed under AS3

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;
				}
			}
		}
	}
}

Post a Comment

Your email is never published nor shared.