我想知道是否有办法使用手机的麦克风修复录制的持续时间。就像当我单击一个按钮时,录制应该开始并且它应该在 5 秒后自行停止,你建议我使用什么方法:-)
编辑:
很抱歉造成混淆,但我正在使用 AudioRecorder 类来记录数据,我认为 MediaRecorder 类函数不能正常工作(/根本)。
我想知道是否有办法使用手机的麦克风修复录制的持续时间。就像当我单击一个按钮时,录制应该开始并且它应该在 5 秒后自行停止,你建议我使用什么方法:-)
编辑:
很抱歉造成混淆,但我正在使用 AudioRecorder 类来记录数据,我认为 MediaRecorder 类函数不能正常工作(/根本)。
如果您只使用计时器,我认为您无法准确控制应用程序读取缓冲区中的数据量。
我认为他们录制 5 秒音频数据的方法是使用此类中的技术。
那里的代码仔细设置了音频缓冲区的大小,以便在记录数据一定时间后回调。这是该课程的片段。
public boolean startRecordingForTime(int millisecondsPerAudioClip,
int sampleRate, int encoding)
{
float percentOfASecond = (float) millisecondsPerAudioClip / 1000.0f;
int numSamplesRequired = (int) ((float) sampleRate * percentOfASecond);
int bufferSize =
determineCalculatedBufferSize(sampleRate, encoding,
numSamplesRequired);
return doRecording(sampleRate, encoding, bufferSize,
numSamplesRequired, DEFAULT_BUFFER_INCREASE_FACTOR);
}
然后稍后在您的代码中执行以下操作:
while (continueRecording)
{
int bufferResult = recorder.read(readBuffer, 0, readBufferSize);
//do stuff
}
由于 readBufferSize 恰到好处,你会得到你想要的数据量(有一些细微的变化)
这就是你所需要的。
@Override
public void onClick(View view)
{
if (view.getId() == R.id.Record)
{
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
files.setEnabled(true);
record.setEnabled(true);
stop.setEnabled(false);
}
});
}
}, 5000);
record.setEnabled(false);
files.setEnabled(false);
stop.setEnabled(true);
try
{
File file = new File(Environment.getExternalStorageDirectory(),
"" + new Random().nextInt(50) + ".3gp");
adapter.add(file.getAbsolutePath());
adapter.notifyDataSetChanged();
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder
.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder
.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(file.getAbsolutePath());
mediaRecorder.prepare();
mediaRecorder.start();
stop.setEnabled(true);
} catch (IllegalStateException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
setMaxDuration
从 MediaRecorder 类中使用。
交替
当您开始录制时,启动一个新线程并将其休眠 5 秒钟。当它醒来时停止录制。或使用定时器任务,它应在 5 秒延迟后调用停止录制。或者