マイクについて
・ | マイクを使用する |
・ | 拡張マイク機能を使用する(Flash 10.3 以降) |
・ | マイクのサウンド出力を設定する |
・ | マイクの増幅率を設定する |
・ | マイクのキャプチャーレートを設定する |
・ | マイクのエコー抑制を設定する |
・ | マイクのアクティビティを検出する |
・ | マイクからサウンドを録音する (Flash 10.1 以降) |
マイクを使用する
サンプルをダウンロード
■Flash Player の設定について
■マイクへのアクセス許可
マイクを使用するには、ユーザーがマイクへのアクセスを許可する必要があります。
Flash Player の設定画面から、マイクへのアクセスを設定することができます。
■マイクの種類を選択
Flash Player の設定画面から、マイクの種類を選択することができます。
■マイクから入力した音をスピーカーから出力する
1.Microphone オブジェクトを取得する
Microphone オブジェクトを取得するには、Microphone.getMicrophone() メソッドを使用します。
第01引数を省略した場合、Flash Player の設定画面で選択したマイクデバイスを取得できます。
マイクが利用できない場合、null が得られます。
Microphone.getMicrophone ( 番号 ) :Microphone
第01引数(略可) | int | 取得したいマイクデバイスを 0 からの番号で指定。(複数のマイクデバイスが存在する場合) |
戻り値 | Microphone | Microphone オブジェクトが得られる。マイクが利用できない場合 null |
デフォルトのマイクオブジェクトを取得
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// 出力テスト
trace(mic_obj);
複数のマイクオブジェクトを取得
import flash.media.Microphone;
// 0 番目のマイクオブジェクトを取得
var mic_obj0:Microphone = Microphone.getMicrophone(0);
// 1 番目のマイクオブジェクトを取得
var mic_obj1:Microphone = Microphone.getMicrophone(1);
// 出力テスト
trace(mic_obj0);
trace(mic_obj1);
2.マイクから入力した音をスピーカーから出力する
マイクから入力した音を、同じ環境にあるスピーカーから出力するには、setLoopBack() メソッドを使用します。
Microphone.setLoopBack ( ループバックを有効にするか? ) :void
第01引数(略可) | Boolean | マイクから入力した音を出力する場合 true を指定。出力を止めたい場合 false を指定。(デフォルトは true) |
戻り値 | void | なし |
マイクから入力した音をスピーカーから出力する
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack(true);
// スピーカー出力を止める
//mic_obj.setLoopBack(false);
}
■ユーザーがマイクへのアクセスを許可しているか調べる
■マイクへのアクセス許可設定について
プログラムからマイクへのアクセスを試みると、以下の様な確認ダイアログが表示されます。
ユーザーが、マイクへのアクセスを拒否した場合、マイク機能を利用することはできません。
■マイクへのアクセス許可設定を調べる
ユーザーが、マイクへのアクセスを許可しているか調べるには、muted プロパティを使用します。
true であれば、利用できません。
マイク機能のミュート設定を調べる
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
trace("マイク機能のミュート設定:" + mic_obj.muted);
}
■「マイクへのアクセス許可設定」の変更を監視する
「マイクへのアクセス許可設定」の変更を監視するには、StatusEvent.STATUS イベントを使用します。
このイベントは、Adobe AIR では動作しません。
引数から得られるオブジェクトの、code プロパティから結果を取得できます。
以下の種類があります。
文字列 | 名称 |
"Microphone.Muted" | マイクへのアクセスが拒否に変化した |
"Microphone.Unmuted" | マイクへのアクセスが許可に変化した |
マイクのアクセス許可設定の結果を取得する
import flash.media.Microphone;
import flash.events.StatusEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// マイクへのアクセス許可が変化した時に実行されるイベント
mic_obj.addEventListener(StatusEvent.STATUS,function (e:StatusEvent):void{
switch(e.code){
case "Microphone.Unmuted":
trace("マイク利用可能");
break;
case "Microphone.Muted":
trace("マイク利用不可能");
break;
}
});
}
■マイクデバイスの総数を取得する
マイクデバイスの総数を調べるには、Microphone.names.length プロパティを使用します。
マイクデバイスの総数を取得
import flash.media.Microphone;
// マイクデバイスの総数を取得
var num:int = Microphone.names.length;
// 出力テスト
trace(num);
■マイクデバイスの名称を取得する
■マイクデバイスの名称をまとめて取得する
マイクデバイスの名称を、配列としてまとめて取得するには、Microphone.names プロパティを使用します。
マイクデバイスの名称を順番に列挙する
import flash.media.Microphone;
// マイクデバイスの名称をまとめて取得する
var camera_names:Array = Microphone.names;
var i:int;
var num:int = camera_names.length;
for(i=0;i < num;i++){
// デバイス名を出力
trace("id:" + i + " name:" + camera_names[i]);
}
■マイクオブジェクトからデバイスの名称を取得する
マイクオブジェクトから、デバイスの名称を取得するには、name プロパティを使用します。
マイクデバイスの名称を順番に列挙する
import flash.media.Microphone;
var i:int;
var num:int = Microphone.names.length;
for(i=0;i < num;i++){
// マイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone(i);
// デバイス名を出力
trace("id:" + i + " name:" + mic_obj.name);
}
■マイク機能が利用可能か調べる
実行環境でマイク機能をサポートしているかを調べるには、Microphone.isSupported プロパティを使用します。
この確認用のプロパティは、Flash Player 10.1 以降、Adobe AIR 2.0 以降で利用可能です。
モバイルなどの環境で動作させる場合、マイク機能をサポートしていない事があります。
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/media/Microphone.html
マイク機能が利用可能か調べる
import flash.media.Microphone;
import flash.text.TextField;
// テキストフィールドを作成
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = 20;
text_field.border = true;
stage.addChild(text_field);
text_field.text = "マイク機能が利用可能:" + Microphone.isSupported;
■「AIR for Android」でマイク機能を使用する
「AIR for Android」でマイク機能を使用するには、以下のパーミッション設定を追加します。
権限名 | 説明 |
RECORD_AUDIO | マイクデバイスへのアクセス |
■Adobe Flash による設定方法
「AIR for Android 設定」の「権限」タブにある、「RECORD_AUDIO」のチェックを有効にします。
■アプリケーション記述ファイルを直接編集する方法
アプリケーション記述ファイルに、以下のパーミッション設定を追加します。
アプリケーション記述ファイルに autoOrients タグを追加する
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<application xmlns="http://ns.adobe.com/air/application/2.0">
~略~
<android>
<manifestAdditions>
<![CDATA[<manifest>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>]]>
</manifestAdditions>
</android>
</application>
拡張マイク機能を使用する(Flash 10.3 以降)
■強化された機能を利用するには?
Flash Player 10.3 以降、AIR 2.7 以降から、音声エコー除去などの強化機能が追加されました。
強化された機能を利用するには、「強化版 Microphone オブジェクト」を取得する必要があります。
■「強化版 Microphone オブジェクト」を取得する
「強化版 Microphone オブジェクト」を取得するには、Microphone.getEnhancedMicrophone() メソッドを使用します。
第01引数を省略した場合、Flash Player の設定画面で選択したマイクデバイスを取得できます。
マイクが利用できない場合、null が得られます。
Microphone.getEnhancedMicrophone ( 番号 ) :Microphone
第01引数(略可) | int | 取得したいマイクデバイスを 0 からの番号で指定。(複数のマイクデバイスが存在する場合) |
戻り値 | Microphone | 強化版 Microphone オブジェクトが得られる。マイクが利用できない場合 null |
デフォルトの「強化版マイクオブジェクト」を取得
import flash.media.Microphone;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// 出力テスト
trace(mic_obj);
複数の「強化版マイクオブジェクト」を取得
import flash.media.Microphone;
// 0 番目の「強化版マイクオブジェクト」を取得
var mic_obj0:Microphone = Microphone.getEnhancedMicrophone(0);
// 1 番目の「強化版マイクオブジェクト」を取得
var mic_obj1:Microphone = Microphone.getEnhancedMicrophone(1);
// 出力テスト
trace(mic_obj0);
trace(mic_obj1);
■ MicrophoneEnhancedOptions オブジェクトを取得する
強化された機能は、MicrophoneEnhancedOptions クラスにまとめられています。
MicrophoneEnhancedOptions オブジェクトにアクセスするには、enhancedOptions プロパティを使用します。
MicrophoneEnhancedOptions オブジェクトを取得
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// 出力テスト
trace(mic_enhanced_options);
}
■ MicrophoneEnhancedOptions オブジェクトの変更を反映する
MicrophoneEnhancedOptions オブジェクトのプロパティを変更しただけでは反映されません。
変更を反映するには、enhancedOptions プロパティに、MicrophoneEnhancedOptions オブジェクトをセットする必要があります。
MicrophoneEnhancedOptions オブジェクトの変更を反映
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// MicrophoneEnhancedOptions オブジェクトの変更を反映する
mic_obj.enhancedOptions = mic_enhanced_options;
}
■拡張マイクモードを設定する
拡張マイクモードを設定するには、mode プロパティを使用します。
以下の、MicrophoneEnhancedMode 定数をセットします。
定数 | 文字列 | 効果 |
MicrophoneEnhancedMode. | "off" | すべての拡張マイク機能を無効化します。 |
MicrophoneEnhancedMode. | "speakerMute" | スピーカーをミュートしている場合に指定します。 音声エコー除去機能は、無効となります。 |
MicrophoneEnhancedMode. | "headset" | ヘッドセットを使用時に指定します。 音声エコー除去機能は、低エコーモードとなります。 軽負荷で動作します。 |
MicrophoneEnhancedMode. | "halfDuplex" | ボイスチャットなどで、片方ずつ話す場合に使用します。 音声エコー除去機能は、半二重モードとなります。 中負荷で動作します。 低品質のマイクとスピーカーでも動作します。 |
MicrophoneEnhancedMode. | "fullDuplex" | ボイスチャットなどで、両方が同時に話す場合に使用します。 音声エコー除去機能は、全二重モードとなります。 高負荷で動作します。 高品質なマイクとスピーカーが必要です。 |
拡張マイクモードを設定する
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
import flash.media.MicrophoneEnhancedMode;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// 拡張マイクモードを設定する
mic_enhanced_options.mode = MicrophoneEnhancedMode.HALF_DUPLEX;
// MicrophoneEnhancedOptions オブジェクトの変更を反映する
mic_obj.enhancedOptions = mic_enhanced_options;
}
■音声エコー除去機能のエコーパスを設定する
音声エコー除去機能のエコーパスを設定するには、echoPath プロパティを使用します。
単位はミリ秒です。128 か 256 を指定します。デフォルトは、128 です。
数値が大きいほど、遅延が大きくなり、高品質で、高負荷となります。
音声エコー除去機能のエコーパスを設定する
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// 音声エコー除去機能のエコーパスを設定する
mic_enhanced_options.echoPath = 256;
// MicrophoneEnhancedOptions オブジェクトの変更を反映する
mic_obj.enhancedOptions = mic_enhanced_options;
}
■ノンリニア処理を設定する
ノンリニア処理を設定するには、nonLinearProcessing プロパティを使用します。
ノンリニア処理を有効にする場合、true をセットします。(デフォルトは、true)
ノンリニア処理は、音声ソースに効果的です。
音楽ソースの場合は、無効にします。
ノンリニア処理を設定する
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// ノンリニア処理を設定する
mic_enhanced_options.nonLinearProcessing = true;
// MicrophoneEnhancedOptions オブジェクトの変更を反映する
mic_obj.enhancedOptions = mic_enhanced_options;
}
■オートゲイン処理を設定する
オートゲイン処理を設定するには、autoGain プロパティを使用します。
オートゲイン処理を有効にする場合、true をセットします。(デフォルトは、false)
オートゲイン処理を設定する
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
// オートゲイン処理を設定する
mic_enhanced_options.autoGain = true;
// MicrophoneEnhancedOptions オブジェクトの変更を反映する
mic_obj.enhancedOptions = mic_enhanced_options;
}
■音声を検出したか調べる
音声を検出したか調べるには、isVoiceDetected プロパティを使用します。
-1 が得られる場合、マイクの準備ができていません。
0 が得られる場合、音声未検出です。
1 が得られる場合、音声を検出しています。
音声を検出したか調べる
import flash.media.Microphone;
import flash.media.MicrophoneEnhancedOptions;
import flash.events.Event;
// デフォルトの「強化版マイクオブジェクト」を取得
var mic_obj:Microphone = Microphone.getEnhancedMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// 毎フレーム実行されるイベント
stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{
// MicrophoneEnhancedOptions オブジェクトを取得
var mic_enhanced_options:MicrophoneEnhancedOptions = mic_obj.enhancedOptions;
trace("音声検出:" + mic_enhanced_options.isVoiceDetected);
});
}
マイクのサウンド出力を設定する
■マイクのサウンド出力を設定する
マイクのサウンド出力を設定するには、soundTransform プロパティを使用します。
SoundTransform クラスについては、こちらで解説します。
ボリュームの制御が可能です。パンの制御は反映されないようです。
マイクのサウンド出力を設定する
import flash.media.Microphone;
import flash.media.SoundTransform;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// サウンドトランスフォームオブジェクトを取得
var sound_transform : SoundTransform = mic_obj.soundTransform;
// ボリュームを設定 (0.0 ~ 1.0)
sound_transform.volume = 0.5;
// サウンドトランスフォームオブジェクトをセットして反映
mic_obj.soundTransform = sound_transform;
}
マイクの増幅率を設定する
■マイクのゲイン(増幅率)を設定する
マイクの入力ボリュームを増幅させるには、gain プロパティを使用します。
0 ~ 100 までの値を指定します。0 に近いほど無音となります。
デフォルト値は 50 です。
シグナルの増幅率を指定
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// ゲインを設定
mic_obj.gain = 50;
}
■Flash Player の設定 (マイクの録音ボリューム)
Flash Player の設定の、マイクの録音ボリュームに相当します。
マイクのキャプチャーレートを設定する
■キャプチャするレート (kHz) を指定する
マイクのキャプチャレートを設定するには、rate プロパティを使用します。
以下の数値を指定します。デフォルトは 11 です。
指定したレートに対応していない場合、実際にサポートする最も近いレートが採用されます。
指定する数値 | 実際のサンプリングレート |
44 | 44100 Hz |
22 | 22050 Hz |
11 | 11025 Hz |
8 | 8000 Hz |
5 | 5512 Hz |
キャプチャレートを変更する
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// キャプチャーレートを設定
mic_obj.rate = 44;
}
マイクのエコー抑制を設定する
■エコー抑制機能とは?
スピーカの近くでマイクを使用すると、キーンという音が発生します。
マイクがスピーカーの音を拾い、入力と出力がループして、音が増幅され続ける為に起こります。
この現象を、ハウリングといいます。
エコー抑制機能を使用すると、ハウリングを軽減する事ができます。
スピーカー環境の場合、有効にすると効果的です。
■エコー抑制を設定する
エコー抑制を設定するには、setUseEchoSuppression() メソッドを使用します。
Microphone.setUseEchoSuppression ( 有効か? ) :void
第01引数 | Boolean | エコー抑制機能を有効にする場合 true を指定、無効にする場合 false を指定。(デフォルト値は false) |
戻り値 | void | なし |
エコー抑制を設定する
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// エコー抑制を設定する
mic_obj.setUseEchoSuppression(true);
}
■エコー抑制の状態を取得する
エコー抑制の状態を取得するには、useEchoSuppression プロパティを使用します。
このプロパティは、読み取り専用です。
エコー抑制の状態を取得する
import flash.media.Microphone;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// エコー抑制を設定する
mic_obj.setUseEchoSuppression(true);
// エコー抑制の状態を取得する
trace(mic_obj.useEchoSuppression);
}
■Flash Player の設定 (エコーを減らす)
Flash Player の設定の、エコーを減らすに相当します。
マイクのアクティビティを検出する
■アクティビティとは?
アクティビティとは、活動を意味します。
マイクの入力音量の大きさから、有音状態、無音状態であるかを検出します。
ボイスチャット利用時に効果的です。
無音状態の時は、オーディオデータを送信する必要が無いので、帯域を節約する事ができます。
■アクティビティの有無の切り替わりを検出する
アクティビティの有無の切り替わりを検出するには、ActivityEvent.ACTIVITY イベントを使用します。
イベントに登録した関数の引数から得られる、ActivityEvent オブジェクトの activating プロパティから、Boolean 値が得られます。
true … 有音状態
false … 無音状態
アクティビティの有無の切り替わりを検出する
import flash.media.Microphone;
import flash.events.ActivityEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// アクティビティの有無が切り替わると呼び出されるイベント
mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
if(e.activating){
trace("有音状態");
}else{
trace("無音状態");
}
});
}
■アクティビティ検出のしきい値を設定する
アクティビティ検出のしきい値を設定するには、setSilenceLevel() メソッドを使用します。
Camera.setSilenceLevel ( しきい値 , タイムアウト ) :void
第01引数 | int | 0 ~ 100 までのしきい値を指定。0 に近いほど少しの変化でも有音状態として検出する。(デフォルトは 50) |
第02引数(略可) | int | 無音状態と判定するまでのタイムアウト時間を指定(単位:ミリ秒)(デフォルトは 2000) |
戻り値 | void | なし |
アクティビティ検出のしきい値を設定する
import flash.media.Microphone;
import flash.events.ActivityEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// アクティビティ検出のしきい値を設定
mic_obj.setSilenceLevel(10,0);
// アクティビティの有無が切り替わると呼び出されるイベント
mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
if(e.activating){
trace("有音状態");
}else{
trace("無音状態");
}
});
}
■アクティビティ検出のしきい値を取得する
アクティビティ検出のしきい値を取得するには、silenceLevel プロパティを使用します。
無音状態と判定するまでの時間(単位:ミリ秒)を取得するには、silenceTimeout プロパティを使用します。
これらのプロパティは、読み取り専用です。
アクティビティ検出のしきい値を取得する
import flash.media.Microphone;
import flash.events.ActivityEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// アクティビティ検出のしきい値を設定
mic_obj.setSilenceLevel(10,0);
// アクティビティ検出のしきい値を取得する
trace(mic_obj.silenceLevel);
// 無音状態と判定するまでの時間を取得
trace(mic_obj.silenceTimeout);
}
■マイク入力音量の実測値を取得する
マイク入力音量の実測値を取得するには、activityLevel プロパティを使用します。
0 から 100 までのボリューム値が得られます。
-1 が得られる場合、マイクデバイスの準備ができていません。
アクティビティレベルを取得する
import flash.media.Microphone;
import flash.events.Event;
import flash.events.ActivityEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// アクティビティ検出のしきい値を設定
mic_obj.setSilenceLevel(10,0);
// アクティビティの有無が切り替わると呼び出されるイベント
mic_obj.addEventListener(ActivityEvent.ACTIVITY,function (e:ActivityEvent):void{
trace("アクティビティ:" + e.activating);
});
// 毎フレーム実行されるイベント
stage.addEventListener(Event.ENTER_FRAME,function (e:Event):void{
trace("アクティビティレベル:" + mic_obj.activityLevel);
});
}
マイクからサウンドを録音する (Flash 10.1 以降)
■マイクから入力された音を、バイナリ形式(PCM)で取得する
マイクから入力されたサウンドを、バイナリ形式(PCM)で取得するには、SampleDataEvent.SAMPLE_DATA イベントを使用します。
■イベントの動作について
このイベントに関数を登録した時点で、録音が開始されます。
登録した関数は、比較的頻繁に呼び出されます。以下の、A→B→C の流れが繰り返されます。
A.バッファにサウンドデータが貯められる
B.一定の量まで貯まると、イベントが発火しバッファにアクセスできる。
C.バッファの中身が不要になったのでクリアされる。
■SampleDataEvent クラスのプロパティについて
登録した関数の引数から、SampleDataEvent オブジェクトが得られます。
SampleDataEvent クラスには、以下のプロパティがあります。
プロパティ | 型 | 解説 |
position | Number | 現在のサンプリング位置(録音を開始した時点を 0 とする) |
data | ByteArray | position のサンプリング位置から蓄積された、サウンドのバイナリデータ(PCM)。 |
■取得例
サウンドデータを取得する
import flash.media.Microphone;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.SampleDataEvent;
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// サウンドデータが一定量貯まるたびに呼び出されるイベント
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
// 現在のサンプリング位置
var pos:Number = e.position;
// サウンドのバイナリデータ
var data:ByteArray = e.data;
// 出力テスト
trace("現在のサンプリング位置:" + pos);
trace("サウンドバッファのサイズ:" + data.length);
});
}
■サウンドデータ(PCM)のフォーマットについて
position プロパティについて
録音を開始してから、現在までに経過したサンプリングの位置を取得するには、position プロパティを使用します。
単位は、サンプリング数です。バイト数ではありません。
無音状態と判定されている間の注意点
アクティビティにより、無音状態と判定されている間は、SampleDataEvent.SAMPLE_DATA イベントは発火しません。
関数は呼び出されませんが、position プロパティのカウントは、止まること無く進み続けます。
これにより、サウンドデータが得られない区間が発生する事になります。
サウンドデータが得られない区間は、すべて 0.0 と考えるといいでしょう。
サンプリングレートについて
キャプチャーレートを取得するには、rate プロパティを使用します。
取得値 | 実際のサンプリングレート |
44 | 44100 Hz |
22 | 22050 Hz |
11 | 11025 Hz |
8 | 8000 Hz |
5 | 5512 Hz |
例えば、キャプチャーレートが 44 である場合、サンプリング数は、44100 Hz となります。
1 秒につき 44100 ずつ、サンプリング位置が増える事になります。
例えば、キャプチャーレートが 11 である場合、サンプリング数は、11025 Hz となります。
1 秒につき 11025 ずつ、サンプリング位置が増える事になります。
バイナリのフォーマットについて
サウンドバッファには、モノラル(1channel)としてデータが蓄積されます。
1 つのデータ(電圧を-1.0 ~ 1.0 に変換した値)が 4Byte で表現されます。
これが 1 チャンネルだけなので 1 サンプリングにつき 4Byte 使用する事になります。
例えば、キャプチャーレートが 44 である場合、
1 秒につき、1 ch × 4 Byte × 44100 Hz = 176400 Byte ずつデータが増えていく事になります。
例えば、キャプチャーレートが 11 である場合、
1 秒につき、1 ch × 4 Byte × 11025 Hz = 44100 Byte ずつデータが増えていく事になります。
取得例
マイクから取得したサウンドデータを、ByteArray に格納し続ける例です。
マイクから得られるサウンドデータを、 ByteArray に格納し続ける
import flash.media.Microphone;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.SampleDataEvent;
// 録音用バッファ
var record_buffer:ByteArray = new ByteArray();
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// キャプチャレートを設定する
mic_obj.rate = 44;
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// サウンドデータが一定量貯まるたびに呼び出されるイベント
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
var data:ByteArray = e.data;
// 欠落区間があれば 0.0 で埋める
var add:Number = e.position * 4 - record_buffer.length;
if(add > 0){
record_buffer.length += add;
}
// サウンドデータを録音用バッファの最後尾に追加
data.readBytes(record_buffer,record_buffer.length,data.length);
});
}
■サウンドデータ(PCM)を使って、サウンドを再生する
再生時のフォーマットについて
サウンドデータ(PCM)を再生するには、サンプリング数が 44100 Hz のステレオ(2チャンネル)形式である必要があります。
このフォーマットに一致するように、サウンドデータを変換します。
キャプチャレート 44 の変換例
例えば、キャプチャーレートが 44 であるサウンドデータを再生する場合です。
モノラルからステレオに変換する必要があります。
よって、以下の図のように 2 個ずつ同じデータを埋めていきます。
キャプチャレート 22 の変換例
例えば、キャプチャーレートが 22 であるサウンドデータを再生する場合です。
モノラルからステレオに変換する必要があります。
サンプリング数が 2 倍に増加します。
よって、以下の図のように 4 個ずつ同じデータを埋めていきます。
キャプチャレート 11 の変換例
例えば、キャプチャーレートが 11 であるサウンドデータを再生する場合です。
モノラルからステレオに変換する必要があります。
サンプリング数が 4 倍に増加します。
よって、以下の図のように 8 個ずつ同じデータを埋めていきます。
■再生例
マイクから得られたサウンドデータを使って、サウンドを再生する例です。
マイクから得られたサウンドデータを画面クリックで再生する
import flash.media.Microphone;
import flash.media.Sound;
import flash.utils.ByteArray;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.SampleDataEvent;
// 録音用バッファ
var record_buffer:ByteArray = new ByteArray();
// デフォルトのマイクオブジェクトを取得
var mic_obj:Microphone = Microphone.getMicrophone();
// マイクが利用可能
if(mic_obj){
// マイクから入力した音をスピーカーから出力
mic_obj.setLoopBack();
// キャプチャレートを設定する
mic_obj.rate = 44;
// 実際に採用されたキャプチャーレートを取得する
var capture_rate:Number = mic_obj.rate;
switch(capture_rate){
case 5: capture_rate = 5512; break;
case 11: capture_rate = 11025; break;
case 22: capture_rate = 22050; break;
case 44: capture_rate = 44100; break;
default: capture_rate = capture_rate * 1000; break;
}
// ------------------------------------------------------------
// サウンドデータが一定量貯まるたびに呼び出されるイベント
// ------------------------------------------------------------
mic_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
var data:ByteArray = e.data;
// 欠落区間があれば 0.0 で埋める
var add:Number = e.position * 4 - record_buffer.length;
if(add > 0){
record_buffer.length += add;
}
// サウンドデータを録音用バッファの最後尾に追加
data.readBytes(record_buffer,record_buffer.length,data.length);
});
// ------------------------------------------------------------
// マウスの左ボタンを押下すると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(MouseEvent.MOUSE_DOWN,function (e:MouseEvent):void{
// 1 度に転送するサンプリング数
var sampling:int = 2048;
// ------------------------------------------------------------
// サウンドオブジェクト
// ------------------------------------------------------------
// サウンドオブジェクトを作成
var sound_obj:Sound = new Sound();
// サウンドデータ要求時に呼び出されるイベント
sound_obj.addEventListener(SampleDataEvent.SAMPLE_DATA, function (e:SampleDataEvent):void{
var i:int;
var d:Number;
var data:ByteArray = e.data;
// 録音バッファの位置を残す
var record_buffer_pos:Number = record_buffer.position;
try{
for(i=0;i < sampling;i++){
// 再生サンプリング位置から録音バッファの位置を計算
record_buffer.position = Math.floor((i + e.position) * (capture_rate / 44100)) * 4;
// 録音バッファから1つ分のデータを取得
d = record_buffer.readFloat();
// L と R に書き込み
data.writeFloat(d);
data.writeFloat(d);
}
}catch(e:Error){
// 0.0 で埋める
data.length = sampling * 2 * 4;
}
// 録音バッファの位置を戻す
record_buffer.position = record_buffer_pos;
});
// 再生開始
sound_obj.play();
});
}