如何在Android中使用audio api录制音频?
答
2)如何以编程方式读取样本?
,我知道,在Android中您可以使用此两类之一录制声音:
-
用于录制音频和视频。记录控制是基于一个简单的状态机
-
的AudioRecord类管理Java应用程序的音频资源记录从平台的音频输入硬件音频上。这是通过“拉动”(读取)来自AudioRecord对象的数据来实现的。应用程序负责使用以下三种方法之一及时轮询AudioRecord对象:read(byte [],int,int),read(short [],int,int)或read(ByteBuffer,int)。选择使用哪种方法将基于AudioRecord用户最方便的音频数据存储格式。
PS:按照上面这个链接来阅读和理解最适合您的需求的。
1)你推荐哪麦克风?
正如我在放在你的问题的评论中提到,这个在这里得到off-topic上计算器,但出于完整性的目的:
答
如果你确实想读取AudioSamples,我会建议指示您使用AudioRecord而不是MediaRecorder,因为它可以让您更好地控制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;
}
}
现在你可以从主类,你计划使用这个类的对象,它会开始给你的音频采样你能处理他们的IAudioReceiver(类使用这些样本)内..
如果你还是想用MediaRecorder,this link能对你有用,
你应该分裂这个问题分成两个不同的人。你应该在[android.stackexchange.com](http://android.stackexchange.com/)中询问的第一部分! – Zuul 2012-07-11 21:30:37