Android语音控制录音APP——根据音量大小自动记录

#留作记录后续参考、欢迎对自动录音有更好的想法的大佬一起讨论!

继参考了很多采集环境音量大小的博客,最后采用这位博主的计算方式,采集出来的音量很稳定
关于Android、ios录音时音量大小的计算

##点击“开始”按钮,开始录制

public void startRecord() {
        flag = false;
        Log.d("AudioRecorder","======开始录音=====");
        new Thread(new Runnable() {
            @Override
            public void run() {
                testVoice();
            }
        }).start();
    }

注:前面已经进行了AudioRecorder的初始化,来源麦克风、单声道、频率16000HZ

##当环境音量超过自定义阈值时,开始写入文件

    public void testVoice(){

        //short[] buffer = new short[bufferSize];
        byte[] buffer = new byte[bufferSizeInBytes];

        //开启录音
        audioRecord.startRecording();

        while (status != Status.STATUS_STOP) {
            //当用户没有点暂停和停止的时候,就一直检测外界声音大小
            //启动录音后,要先read buffer,才会通知激活 listener
            if(buffer != null && buffer.length > 0)
            {
                int len = audioRecord.read(buffer, 0, buffer.length);
                if(len > 0)
                {
                    data = new byte[len];
                    //将录音数据存到data数组中
                    System.arraycopy(buffer, 0, data, 0, len);
                    double realVolume  = calculateVolume(data);
                    Log.v("realvolume", "测试当前环境音量==" + realVolume );

                    //环境中有声音
                    if(realVolume  > 8.0)
                    {
                        status =Status.STATUS_START;
                        Log.i("=====================", "=====================start");
                        writeDataToFile();
                    }
                    //环境中没声音
                    else if(8.0 >= realVolume  && realVolume  >= 0)
                    {
                        status = Status.STATUS_PAUSE;
                        Log.i("=====================", "=====================pause");
                    }
                    //当返回的值无效
                    else if(isNaN(realVolume ))
                    {
                        Log.i("=====================", "=====================other");
                        break;
                    }
                }else {
                    break;
                }
            } else {
                break;
            }
        }
    }

##将录音写入文件,pcm格式

public void writeDataToFile(){

        byte fileData[] = new byte[data.length];

        if(data != null) {
            System.arraycopy(data, 0, fileData, 0, data.length);
            RandomAccessFile mRandomAccessFile = null;
            try {
                mRandomAccessFile = new RandomAccessFile(new File(FileUtils.getPcmFileAbsolutePath(fileName)), rw);
                //跳到最后一字节,追加内容
                mRandomAccessFile.seek(mRandomAccessFile.length());
                //long m = mRandomAccessFile.length();
                mRandomAccessFile.write(fileData, 0, fileData.length);

                //停止录制
                if(status == Status.STATUS_STOP && mRandomAccessFile != null) {
                    // 关闭写入流
                    mRandomAccessFile.close();
                }else {
                    return;
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

##用户点击“停止”按钮,停止环境音量的检测,文件流关闭

public void stopRecord() {
        Log.d("AudioRecorder","====停止录音====");
        {
            status = Status.STATUS_STOP;
            if(!flag)
            //如果AudioRecord没有被关闭
            {
                audioRecord.stop();
            }
            release();
        }
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值