最近项目需要AudioRecord进行录音保存PCM格式的文件 所以MedioRecorder就不能使用了,需求又要显示分贝值MedioRecorder直接有个api转换就行,但是AudioRecord并没有这个api ,自己在网上找了半天都找到 。看别人的都是用short进行转换,但是写入文件要用byte所以这中间就有问题。 自己就查找 byte 先转成 short 然后再进行计算分贝值 来达到目的。 这里记录一下,因为看的文章比较多 记得不是很清楚了。还是感觉大牛们的文章。
这里就不详情记录从头到尾的代码了,只贴计算这块。
/**
* 将音频信息写入文件
*/
private void writeDataTOFile() {
// new一个byte数组用来存一些字节数据,大小为缓冲区大小
byte[] audiodata = new byte[bufferSizeInBytes];
FileOutputStream fos = null;
int readsize = 0;
try {
String currentFileName = mFileName;
if (mState == STATE_PAUSE_RECORDING) {
//假如是暂停录音 将文件名后面加个数字,防止重名文件内容被覆盖
currentFileName += filesName.size();
}
filesName.add(currentFileName);
File file = new File(AudioFileUtils.getPcmFileAbsolutePath(currentFileName));
if (file.exists()) {
file.delete();
}
fos = new FileOutputStream(file);// 建立一个可存取字节的文件
LogUtils.e(TAG, "file:" + file.getAbsoluteFile());
} catch (IllegalStateException e) {
LogUtils.e("AudioRecorder", e.getMessage());
throw new IllegalStateException(e.getMessage());
} catch (FileNotFoundException e) {
LogUtils.e("AudioRecorder", e.getMessage());
}
//将录音状态设置成正在录音状态
mState = STATE_RECORDING;
handle.sendEmptyMessage(CONTINUE_WHAT);
while (mState == STATE_RECORDING && audioRecord != null) {
readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
if (AudioRecord.ERROR_INVALID_OPERATION != readsize && fos != null) {
try {
long v = 0;
short[] buffer = bytesToShort(audiodata);
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
// 平方和除以数据总长度,得到音量大小。
double mean = v / (double) readsize;
volume = 10 * Math.log10(mean);
fos.write(audiodata);
} catch (IOException e) {
LogUtils.e("AudioRecorder", e.getMessage());
}
}
}
try {
if (fos != null) {
fos.close();// 关闭写入流
}
} catch (IOException e) {
LogUtils.e("AudioRecorder", e.getMessage());
}
}
private short[] bytesToShort(byte[] bytes) {
if (bytes == null) {
return null;
}
short[] shorts = new short[bytes.length / 2];
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
return shorts;
}
AudioRecord获取后网上资料说有个背景音在30左右 这个目前还没查到什么办法去除掉,希望大佬解决了能告诉一下。
本文介绍使用Android AudioRecord进行录音并保存为PCM格式的方法,重点讲解如何通过byte到short转换计算音频分贝值,解决AudioRecord API缺乏的问题。
1403

被折叠的 条评论
为什么被折叠?



