最近项目需要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左右 这个目前还没查到什么办法去除掉,希望大佬解决了能告诉一下。