2011.03.09
21:32
author: taikiken
0件のコメント
没ネタ供養シリーズ、お楽しみいただけたでしょうか。
中途半端な作り込みで少々お恥ずかしいのですが、没ネタということでお許しください。
ActionScriptでの録音処理です。
flash.media.Microphone
を使います。
まずマイクを取得します。
var microphone:Microphone = Microphone.getMicrophone(); |
var microphone:Microphone = Microphone.getMicrophone();
ゲインとレートを設定します。
microphone.gain = 100;
microphone.rate = 44; |
microphone.gain = 100;
microphone.rate = 44;
ゲインはMaxの100にしています。
CDなどのレートは44.1KHzなので、44.1と設定したいところですがレートはint型なので44です。
フィードバック(ハウリング)対策のためにsetSilenceLevel
を指定します。
microphone.setSilenceLevel(0, 3000); |
microphone.setSilenceLevel(0, 3000);
public function setSilenceLevel(silenceLevel:Number, timeout:int = -1):void
via API Document : http://help.adobe.com/ja_JP/AS3LCR/Flex_4.0/flash/media/Microphone.html?allClasses=1
サウンドと見なす最小入力レベルと、実際に無音状態が始まったと見なすまでの無音時間の長さを設定します。後者は省略可能です。
サウンドと見なす最小入力レベルを 0
にしました。
無音時間の長さは 3000ms(3sec)にしています。
デフォルトの -1 は 2000ms(2sec)になります。
SampleDataEvent.SAMPLE_DATA
のリスナーを設定します。
microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); |
microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
イベントハンドラ
var byteArray:ByteArray = new ByteArray();
function onSampleData(event:SampleDataEvent):void
{
while(event.data.bytesAvailable > 0) {
byteArray.writeFloat(event.data.readFloat());
}
} |
var byteArray:ByteArray = new ByteArray();
function onSampleData(event:SampleDataEvent):void
{
while(event.data.bytesAvailable > 0) {
byteArray.writeFloat(event.data.readFloat());
}
}
API Documentのサンプルコードにならいwhile
を使わず単純に以下のような1行にすると音飛びが発生してしまいました。
byteArray.writeFloat(event.data.readFloat()); |
byteArray.writeFloat(event.data.readFloat());
SampleDataEvent.SAMPLE_DATA
発生間隔にたまっているデータを吐き出させないといけないようです。
最後にWaveへのエンコードですが sazameki
を参考にさせてもらいました。
org.sazameki.audio.format.wav.Wav
【おまけ】
夕方に「できる?」な問い合わせがあり時計の針がシンデレラタイムを過ぎた頃にデモができあがったのですが、残念ながら翌朝あっさりキャンセル。
もうひとつ残念なお知らせはじっくり探してみるとライブラリがすでにあったことです。
bytearray.org : MicRecorder, a tiny microphone library
マイクから入力した音声をWave
形式で保存したいなら bytearray.org
の MicRecorder
を使うといいよ。
本当に残念なお話でした。
半年近く溜め込んでたものが吐き出せて少しスッキリしています。