问题描述
应用开始使用android AudioRecord进行录制。以下是初始化的AudioRecord对象的代码,并在while循环中使用其读取方法从中读取数据。在Redmi中,设备循环计数和文件大小每次都是完美的,但是在执行sumsung设备循环计数和文件大小时此代码不同。 / p>
Log.d(TAG,“ writeAudioDataToFile:” + recordFile.length());
这大约是在三星设备logcat上录制5秒钟
2020-08-14 13:27:47.459 31260-31805/com.example.voicerecord D/WavRecorder: writeAudioDataToFile: 71138592
这是在Redmi设备logcat上录制大约5秒钟
2020-08-14 13:28:36.384 23780-23906/com.example.voicerecord D/WavRecorder: writeAudioDataToFile: 491008
文件大小=采样率*样本大小*以秒为单位的时间*频道/ 8
在此代码中
采样率= 44100 Hz
样本大小= 16位
以秒为单位的时间= 5秒
单声道的通道= 1
所以redmi设备会生成正确的文件,但Samsung设备不会。什么是 三星设备的解决方案。
@Override
public void prepare(String outputFile,int channelCount,int sampleRate,int bitrate) {
this.sampleRate = sampleRate;
this.framesPerVisInterval = (int)((VISUALIZATION_INTERVAL/1000f)/(1f/sampleRate));
Log.d(TAG,"prepare: channelcount"+channelCount);
this.channelCount = channelCount;
recordFile = new File(outputFile);
if (recordFile.exists() && recordFile.isFile()) {
int channel = channelCount == 1 ? AudioFormat.CHANNEL_IN_MONO :
AudioFormat.CHANNEL_IN_STEREO;
try {
bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize == AudioRecord.ERROR || bufferSize == AudioRecord.ERROR_BAD_VALUE) {
bufferSize = AudioRecord.getMinBufferSize(sampleRate,AudioFormat.ENCODING_PCM_16BIT);
}
Log.d(TAG,"prepare: "+bufferSize);
recorder = new AudioRecord(
MediaRecorder.AudioSource.MIC,sampleRate,AudioFormat.ENCODING_PCM_16BIT,bufferSize
);
} catch (IllegalArgumentException e) {
Timber.e(e,"sampleRate = " + sampleRate + " channel = " + channel + " bufferSize = " + bufferSize);
if (recorder != null) {
recorder.release();
}
}
if (recorder != null && recorder.getState() == AudioRecord.STATE_INITIALIZED) {
if (recorderCallback != null) {
recorderCallback.onPrepareRecord();
}
} else {
Timber.e("prepare() Failed");
if (recorderCallback != null) {
recorderCallback.onError(new RecorderInitException());
}
}
} else {
if (recorderCallback != null) {
recorderCallback.onError(new InvalidOutputFile());
}
}
}
@Override
public void startRecording() {
if (recorder != null && recorder.getState() == AudioRecord.STATE_INITIALIZED) {
if (isPaused) {
startRecordingTimer();
recorder.startRecording();
if (recorderCallback != null) {
recorderCallback.onStartRecord(recordFile);
}
isPaused = false;
} else {
try {
recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
writeAudioDataToFile();
}
},"AudioRecorder Thread");
recordingThread.start();
startRecordingTimer();
if (recorderCallback != null) {
recorderCallback.onStartRecord(recordFile);
}
} catch (IllegalStateException e) {
Timber.e(e,"startRecording() Failed");
if (recorderCallback != null) {
recorderCallback.onError(new RecorderInitException());
}
}
}
}
}
private void writeAudioDataToFile() {
byte[] data = new byte[bufferSize];
FileOutputStream fos;
try {
if(isAppend){
fos = new FileOutputStream(recordFile,true);
}else{
fos = new FileOutputStream(recordFile);
}
} catch (FileNotFoundException e) {
Timber.e(e);
fos = null;
}
if (null != fos) {
int chunksCount = 0;
ByteBuffer shortBuffer = ByteBuffer.allocate(2);
shortBuffer.order(ByteOrder.LITTLE_ENDIAN);
//Todo: disable loop while pause.
while (isRecording) {
if (!isPaused) {
if (endProgress == totalProgress) {
chunksCount += recorder.read(data,bufferSize);
if (AudioRecord.ERROR_INVALID_OPERATION != chunksCount) {
long sum = 0;
for (int i = 0; i < bufferSize; i += 2) {
//Todo: find a better way to covert bytes into shorts.
shortBuffer.put(data[i]);
shortBuffer.put(data[i + 1]);
sum += Math.abs(shortBuffer.getShort(0));
shortBuffer.clear();
}
lastVal = (int) (sum / (bufferSize / 16));
try {
fos.write(data);
} catch (IOException e) {
Timber.e(e);
stopRecording();
}
}
}
}
}
try {
fos.close();
} catch (IOException e) {
Timber.e(e);
}
Log.d(TAG,"writeAudioDataToFile: "+recordFile.length());
setWaveFileHeader(recordFile,channelCount);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)