バージョン 2.3.3 の LG Android Phone を持っています。音声サンプルを読み取るアプリを作成したいので、ヘッドフォン ジャックにマイクを接続する必要があります。
プログラムでサンプルを読み取るにはどうすればよいですか?.
バージョン 2.3.3 の LG Android Phone を持っています。音声サンプルを読み取るアプリを作成したいので、ヘッドフォン ジャックにマイクを接続する必要があります。
プログラムでサンプルを読み取るにはどうすればよいですか?.
本当に AudioSamples を読みたい場合は、MediaRecorder の代わりに AudioRecord を使用することをお勧めします。これにより、AudioSamples をより詳細に制御できます...そのためには、次のコードを使用できます。AudioCapturer は、サンプルを取得するために使用するラッパー クラスです。 AudioRecord オブジェクト..IAudioReceiver は、オーディオ データを処理するためのメソッドを持つインターフェイスです。
public class AudioCapturer implements Runnable {
private AudioRecord audioRecorder = null;
private int bufferSize;
private int samplePerSec = 16000;
private String LOG_TAG = "AudioCapturer";
private Thread thread = null;
private boolean isRecording;
private static AudioCapturer audioCapturer;
private IAudioReceiver iAudioReceiver;
private AudioCapturer(IAudioReceiver audioReceiver) {
this.iAudioReceiver = audioReceiver;
}
public static AudioCapturer getInstance(IAudioReceiver audioReceiver) {
if (audioCapturer == null) {
audioCapturer = new AudioCapturer(audioReceiver);
}
return audioCapturer;
}
public void start() {
bufferSize = AudioRecord.getMinBufferSize(samplePerSec, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize != AudioRecord.ERROR) {
audioRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, this.samplePerSec, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, this.bufferSize * 10); // bufferSize
// 10x
if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
Log.i(LOG_TAG, "Audio Recorder created");
audioRecorder.startRecording();
isRecording = true;
thread = new Thread(this);
thread.start();
} else {
Log.e(LOG_TAG, "Unable to create AudioRecord instance");
}
} else {
Log.e(LOG_TAG, "Unable to get minimum buffer size");
}
}
public void stop() {
isRecording = false;
if (audioRecorder != null) {
if (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
// System.out
// .println("Stopping the recorder inside AudioRecorder");
audioRecorder.stop();
}
if (audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecorder.release();
}
}
}
public boolean isRecording() {
return (audioRecorder != null) ? (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) : false;
}
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
while (isRecording && audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
short[] tempBuf = new short[Constants.FRAME_SIZE / 2];
audioRecorder.read(tempBuf, 0, tempBuf.length);
iAudioReceiver.capturedAudioReceived(tempBuf, false);
}
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("AudioCapturer finalizer");
if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
audioRecorder.stop();
audioRecorder.release();
}
audioRecorder = null;
iAudioReceiver = null;
thread = null;
}
}
これで、プログラムの Main クラスからこのクラスのオブジェクトを使用できるようになり、IAudioReceiver (これらのサンプルを使用するクラス) 内で処理できるオーディオ サンプルの提供が開始されます。
それでも MediaRecorder を使用したい場合は、このリンクが役に立ちます。
2) プログラムでサンプルを読み取るにはどうすればよいですか?
私が知っているのは、Android では、次の 2 つのクラスのいずれかを使用して音声を録音できることです。
オーディオとビデオを記録するために使用されます。記録制御は単純なステートマシンに基づいています
AudioRecord クラスは、Java アプリケーションがプラットフォームのオーディオ入力ハードウェアからオーディオを録音するためのオーディオ リソースを管理します。これは、AudioRecord オブジェクトからデータを「引き出す」(読み取る) ことによって実現されます。アプリケーションは、read(byte[], int, int)、read(short[], int, int)、または read(ByteBuffer, int) の 3 つのメソッドのいずれかを使用して、AudioRecord オブジェクトを時間内にポーリングする必要があります。どの方法を使用するかは、AudioRecord のユーザーにとって最も便利なオーディオ データ ストレージ形式に基づいて選択されます。
Ps:上記のリンクをたどって、ニーズに最も適したものを読んで理解してください。
1) どのマイクをお勧めしますか?
あなたの質問に寄せられたコメントで述べたように、これはここでstackoverflowのトピックから外れますが、完全を期すために: