AudioRecord获取分贝值

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值