需要一个简单的录音示例
Posted
技术标签:
【中文标题】需要一个简单的录音示例【英文标题】:Need a simple example for audio recording 【发布时间】:2011-09-03 06:47:07 【问题描述】:我需要在 android 中使用 AudioRecorder 进行简单的音频录制和播放示例。我用 MediaRecorder 试过了,效果很好。
【问题讨论】:
【参考方案1】:你是说AudioRecord
?搜索例如“AudioRecord.OnRecordPositionUpdateListener”使用 Google 代码搜索。顺便说一句,AudioRecord
录制,而不是播放。
另见:
Improve Android Audio Recording quality? Android AudioRecord class - process live mic audio quickly, set up callback function【讨论】:
【参考方案2】:这是录音的示例代码。
private Runnable recordRunnable = new Runnable()
@Override
public void run()
byte[] audiodata = new byte[mBufferSizeInBytes];
int readsize = 0;
Log.d(TAG, "start to record");
// start the audio recording
try
mAudioRecord.startRecording();
catch (IllegalStateException ex)
ex.printStackTrace();
// in the loop to read data from audio and save it to file.
while (mInRecording == true)
readsize = mAudioRecord.read(audiodata, 0, mBufferSizeInBytes);
if (AudioRecord.ERROR_INVALID_OPERATION != readsize
&& mFos != null)
try
mFos.write(audiodata);
catch (IOException e)
e.printStackTrace();
// stop recording
try
mAudioRecord.stop();
catch (IllegalStateException ex)
ex.printStackTrace();
getActivity().runOnUiThread(new Runnable()
@Override
public void run()
mRecordLogTextView.append("\n Audio finishes recording");
);
// close the file
try
if (mFos != null)
mFos.close();
catch (IOException e)
e.printStackTrace();
;
那么你需要两个按钮(或者一个在不同的时间充当不同的功能)来启动和停止记录线程。
mRecordStartButton = (Button) rootView
.findViewById(R.id.audio_record_start);
mRecordStartButton.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
// initialize the audio source
int recordChannel = getChoosedSampleChannelForRecord();
int recordFrequency = getChoosedSampleFrequencyForRecord();
int recordBits = getChoosedSampleBitsForRecord();
Log.d(TAG, "recordBits = " + recordBits);
mRecordChannel = getChoosedSampleChannelForSave();
mRecordBits = getChoosedSampleBitsForSave();
mRecordFrequency = recordFrequency;
// set up the audio source : get the buffer size for audio
// record.
int minBufferSizeInBytes = AudioRecord.getMinBufferSize(
recordFrequency, recordChannel, recordBits);
if(AudioRecord.ERROR_BAD_VALUE == minBufferSizeInBytes)
mRecordLogTextView.setText("Configuration Error");
return;
int bufferSizeInBytes = minBufferSizeInBytes * 4;
// create AudioRecord object
mAudioRecord = new AudioRecord(MediaRecorder.Audiosource.MIC,
recordFrequency, recordChannel, recordBits,
bufferSizeInBytes);
// calculate the buffer size used in the file operation.
mBufferSizeInBytes = minBufferSizeInBytes * 2;
// reset the save file setup
String rawFilePath = WaveFileWrapper
.getRawFilePath(RAW_PCM_FILE_NAME);
try
File file = new File(rawFilePath);
if (file.exists())
file.delete();
mFos = new FileOutputStream(file);
catch (Exception e)
e.printStackTrace();
if (mInRecording == false)
mRecordThread = new Thread(recordRunnable);
mRecordThread.setName("Demo.AudioRecord");
mRecordThread.start();
mRecordLogTextView.setText(" Audio starts recording");
mInRecording = true;
// enable the stop button
mRecordStopButton.setEnabled(true);
// disable the start button
mRecordStartButton.setEnabled(false);
// show the log info
String audioInfo = " Audio Information : \n"
+ " sample rate = " + mRecordFrequency + "\n"
+ " channel = " + mRecordChannel + "\n"
+ " sample byte = " + mRecordBits;
mRecordLogTextView.setText(audioInfo);
);
mRecordStopButton = (Button) rootView
.findViewById(R.id.audio_record_stop);
mRecordStopButton.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
if (mInRecording == false)
Log.d(TAG, "current NOT in Record");
else
// stop recording
if (mRecordThread != null)
Log.d(TAG, "mRecordThread is not null");
mInRecording = false;
Log.d(TAG, "set mInRecording to false");
try
mRecordThread.join(TIMEOUT_FOR_RECORD_THREAD_JOIN);
Log.d(TAG, "record thread joins here");
catch (InterruptedException e)
e.printStackTrace();
mRecordThread = null;
// re-enable the start button
mRecordStartButton.setEnabled(true);
// disable the start button
mRecordStopButton.setEnabled(false);
else
Log.d(TAG, "mRecordThread is null");
);
然后您可以将 pcm 数据保存到 WAV 文件中。
【讨论】:
以上是关于需要一个简单的录音示例的主要内容,如果未能解决你的问题,请参考以下文章