スペース失礼します。
マイクを使ったアプリを作るべく、マイク入力について調べていたのですがどうしてもマイク入力(AudioRecord)からスピーカーに出力(AudioTrack track)するのに1秒程度のタイムラグが発生します。
このズレがどうして起こるのか、改善できるのかが不明なため、いろいろ調べてみたのですが結局わからなかったためここで質問させていただきました。
何か情報・解決策があれば教えていただきたいと思います。
記述方法は以下の状態です。
int bufSize = AudioRecord.getMinBufferSize(
SAMPLING_RATE,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT) * 2;[
// AudioRecordの作成
AudioRecord audioRec = new AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLING_RATE,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
//AudioFormat.CHANNEL_CONFIGURATION_STEREO,
AudioFormat.ENCODING_PCM_16BIT,//AudioFormat.ENCODING_PCM_8BIT,
bufSize);
AudioTrack track = new AudioTrack(
//streamType どの音を出すかってこと?
AudioManager.STREAM_MUSIC,
//AudioManager = Androidで音量を調節するもの
//音楽音量(STREAM_MUSIC)
//sampleRateInHz:サンプリング周波数
SAMPLING_RATE,
//channelConfig(モノラル指定)
AudioFormat.CHANNEL_CONFIGURATION_MONO,
//audioFormat
AudioFormat.ENCODING_DEFAULT,
//bufferSizeInBytes:バイト単位のバッファサイズ
//サンプリングレートが44100でバッファサイズが44100なので、
//このAudioTrackには1秒分の音声データを格納することができます。
44100,
//mode(STREAMモード指定)
AudioTrack.MODE_STREAM
);
//再生
track.play();
audioRec.startRecording();
bIsRecording = true;
thread = new Thread(new Runnable(){
@Override
public void run() {
byte buf[] = new byte[bufSize];
// TODO Auto-generated method stub
while (bIsRecording) {
// 録音データ読み込み
audioRec.read(buf, 0, buf.length);
Log.v("AudioRecord", "read " + buf.length + " bytes");
track.write(buf, 0, buf.length);
}
// 録音停止
Log.v("AudioRecord", "stop");
}
});
thread.start();