録音と再生のIOストリームで入力した音をリアルタイム再生する
録音の仕方
データストリームとして音声データを読み込む - Androidプログラマへの道 〜 Moonlight 明日香 〜 - Seesaa Wiki(ウィキ)
再生の仕方
音声を使って楽しげなものを作りたい。再生をする。 - 素人のアンドロイドアプリ開発日記
オーディオのオブジェクトの取得の仕方
android - AudioRecord object not initializing - Stack Overflow
一部意味などは分かっていませんが
この3つを組み合わせてできました
package com.example.recodeplay; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder.AudioSource; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { AudioRecord audioRec = null; Button btn = null; boolean bIsRecording = false; int bufSize; int samplingRate; private AudioTrack audioTrack; private void recodingAndPlay() { if (bIsRecording) { bIsRecording = false; } else { // 録音開始 Log.v("AudioRecord", "startRecording"); audioRec.startRecording(); bIsRecording = true; // 録音スレッド 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); audioTrack.write(buf, 0, buf.length); // Log.v("AudioRecord", "read " + buf.length + // " bytes"); } // 録音停止 Log.v("AudioRecord", "stop"); audioRec.stop(); } }).start(); } } private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; public AudioRecord findAudioRecord() { for (int rate : mSampleRates) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { try { Log.d("TAG", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { // check if we can instantiate and have a success AudioRecord recorder = new AudioRecord( AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); if (recorder.getState() == AudioRecord.STATE_INITIALIZED) bufSize = bufferSize; samplingRate = rate; return recorder; } } catch (Exception e) { Log.e("TAG", rate + "Exception, keep trying.", e); } } } } return null; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // AudioRecordの作成 audioRec = findAudioRecord(); audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM); audioTrack.play(); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { recodingAndPlay(); } }); } }
普通に出した声が耳の所で聞こえる!!
つまりこれができるってことはラインみたいな音声通話って結構簡単にできそう。。。
takam