android - API <23 的 Android MediaRecorder setMaxDuration 失败
问题描述
我正在使用此代码录制音频文件。适用于最近的设备,但适用于较旧的设备。MediRecorder 在 1 秒后停止,而不是在 setMaxDuration() 中设置的 1 分钟。以及播放录制文件时。每录制 1 秒就变成 1 分钟播放时间。例如,如果我录制 5 分钟,当我尝试在播放器中播放录制的文件时,持续时间变为 5 分钟。
public void startRecording() {
mFileName=this.getNewRecordFilePath(mContext);
mediaRecorder = new MediaRecorder();
mediaRecorder.setOnErrorListener(this);
try {
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(AudioFormat.ENCODING_PCM_16BIT);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioChannels(1);
mediaRecorder.setAudioEncodingBitRate(128000);
mediaRecorder.setAudioSamplingRate(getValidSampleRates());
mediaRecorder.setOutputFile(mFileName);
mediaRecorder.setMaxDuration(Max_Record_Time_Minute * 60000);
mediaRecorder.setOnInfoListener(this);
mediaRecorder.prepare();
mediaRecorder.start();
chronometerReset();
chronometer.start();
if(this.mRecorderListener!=null){
this.mRecorderListener.onRecordStart(mFileName);
}
} catch (IllegalStateException e) {
releaseMediaRecorder();
if(this.mRecorderListener!=null){
mRecorderListener.onRecordError(e.getMessage());
}
} catch (IOException e) {
releaseMediaRecorder();
if(this.mRecorderListener!=null){
mRecorderListener.onRecordError(e.getMessage());
}
}catch(Exception ex){
ex.printStackTrace();
if(this.mRecorderListener!=null){
mRecorderListener.onRecordError(ex.getMessage());
}
}
}
private int getValidSampleRates() {
int bfs=8000;
for (int rate : new int[]{48000, 16000, 8000}) { // add the rates you wish to check against
int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize > 0) {
// buffer size is valid, Sample rate supported
return rate;
}
}
return bfs;
}
谁能帮我找到解决方案。
解决方案
推荐阅读
- php - OAuth 是否允许 localhost 进行调试?
- c# - 是什么导致 ComboBox 显示 `System.Data.DataRowView`
- react-native - 在 expo init 上找不到模块
- git - 如何在 git 存储库上移动标签
- ruby - kv 插件:检查 value 是否为数组,并将 value 分配给新字段
- kubernetes - 如何从java app(k8s)收集日志到fluentd(k8s)
- java - 为什么我的测试junit cucumber测试在一起运行时失败,但单独通过,在第二次测试中抛出没有这样的ID会话?
- ios - 拖动时更改表格视图单元格背景颜色
- javascript - 为数组中的每个项目创建一个新的音频元素?
- ruby-on-rails - 在 csv 文件上创建带时间戳的标签(ruby 代码)