2010年7月21日水曜日

Android AudioRecordクラス

Androidのマイク入力を扱うためにAudioRecordクラスのテスト。
色んなサイト見てコーディングしてみた。

…がうまくいかない。

ソースはこんなん(注:実行しても動きません→追記:permissionの設定すれば動きます。この記事参照)

package org.example.microphone;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.media.AudioRecord.OnRecordPositionUpdateListener;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class Microphone extends Activity {

private static final int AUDIO_SAMPLE_FREQ = 8000;
//Bufferサイズ(getMinBufferSize()で取得できる値の2倍)
private static final int AUDIO_BUFFER_SIZE = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_FREQ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.CHANNEL_CONFIGURATION_MONO) * 2;

private static final String TAG = "debug";

AudioRecord record;
mNotification notificaiotn;
TextView textView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Log.d(TAG,String.valueOf(AUDIO_BUFFER_SIZE));

textView = (TextView)findViewById(R.id.textView);
setContentView(R.layout.main);

//recorderインスタンスのコンストラクタ設定
try{
record = new AudioRecord(MediaRecorder.AudioSource.MIC,
AUDIO_SAMPLE_FREQ,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
AUDIO_BUFFER_SIZE);
}
catch(IllegalArgumentException e){
e.printStackTrace();
}

Log.d(TAG,String.valueOf(record.getState()));

record.setNotificationMarkerPosition(50);
record.setPositionNotificationPeriod(100);
record.setRecordPositionUpdateListener(notificaiotn);


}

//オーディオ入力イベントリスナの実装
public class mNotification implements OnRecordPositionUpdateListener{

@Override
public void onMarkerReached(AudioRecord recorder) {
// TODO Auto-generated method stub

//read PCM buffer here
byte[] audioBuffer = new byte[AUDIO_SAMPLE_FREQ];
record.read(audioBuffer,0,AUDIO_SAMPLE_FREQ);

textView.setText(String.valueOf(audioBuffer));

}

@Override
public void onPeriodicNotification(AudioRecord recorder) {
// TODO Auto-generated method stub

//read PCM buffer here
byte[] audioBuffer = new byte[AUDIO_SAMPLE_FREQ];
record.read(audioBuffer,0,AUDIO_SAMPLE_FREQ);
}}

@Override
public void onPause(){
super.onPause();

}

}


どうもsetNotificationMarketPosition部分でAudioRecordのインスタンス初期化が出来ていないみたい。エラーログはこんな感じ。

07-21 21:54:24.749: ERROR/AudioFlinger(35): Request requires android.permission.RECORD_AUDIO

permissionの設定が問題なのかしら?
明日はそこら辺のいじくり方について調べるか。

----------
※参考URL
[1]http://www.mail-archive.com/android-developers@googlegroups.com/msg35441.html
[2]http://www.mailinglistarchive.com/html/android-group-japan@googlegroups.com/2009-10/msg00035.html
[3]http://d.hatena.ne.jp/yamanetoshi/20100202/1265036548
[4]http://www.mailinglistarchive.com/html/android-group-japan@googlegroups.com/2010-06/msg00617.html
[5]http://groups.google.co.jp/group/android-developers/browse_thread/thread/38cabdc4a48358a9?fwc=1
[6]http://developer.android.com/reference/android/media/AudioRecord.html

0 件のコメント:

コメントを投稿