软件编程
位置:首页>> 软件编程>> Android编程>> Android录音时获取分贝值的方法代码实例

Android录音时获取分贝值的方法代码实例

作者:junjie  发布时间:2022-03-03 04:15:12 

标签:Android,录音,分贝值

参考文章Android中实时获取音量分贝值详解:https://www.jb51.net/article/64806.htm


public class MediaRecorderDemo {
 private final String TAG = "MediaRecord";
 private MediaRecorder mMediaRecorder;
 public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
 private String filePath;

public MediaRecorderDemo(){
   this.filePath = "/dev/null";
 }

public MediaRecorderDemo(File file) {
   this.filePath = file.getAbsolutePath();
 }

private long startTime;
 private long endTime;

/**
  * 开始录音 使用amr格式
  *
  *      录音文件
  * @return
  */
 public void startRecord() {
   // 开始录音
   /* ①Initial:实例化MediaRecorder对象 */
   if (mMediaRecorder == null)
     mMediaRecorder = new MediaRecorder();
   try {
     /* ②setAudioSource/setVedioSource */
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
     /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
           /*
      * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
      * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
      */
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

/* ③准备 */
     mMediaRecorder.setOutputFile(filePath);
     mMediaRecorder.setMaxDuration(MAX_LENGTH);
     mMediaRecorder.prepare();
     /* ④开始 */
     mMediaRecorder.start();
     // AudioRecord audioRecord.
     /* 获取开始时间* */
     startTime = System.currentTimeMillis();
     updateMicStatus();
     Log.i("ACTION_START", "startTime" + startTime);
   } catch (IllegalStateException e) {
     Log.i(TAG,
         "call startAmr(File mRecAudioFile) failed!"
             + e.getMessage());
   } catch (IOException e) {
     Log.i(TAG,
         "call startAmr(File mRecAudioFile) failed!"
             + e.getMessage());
   }
 }

/**
  * 停止录音
  *
  */
 public long stopRecord() {
   if (mMediaRecorder == null)
     return 0L;
   endTime = System.currentTimeMillis();
   Log.i("ACTION_END", "endTime" + endTime);
   mMediaRecorder.stop();
   mMediaRecorder.reset();
   mMediaRecorder.release();
   mMediaRecorder = null;
   Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));
   return endTime - startTime;
 }

private final Handler mHandler = new Handler();
 private Runnable mUpdateMicStatusTimer = new Runnable() {
   public void run() {
     updateMicStatus();
   }
 };

/**
  * 更新话筒状态
  *
  */
 private int BASE = 1;
 private int SPACE = 100;// 间隔取样时间

private void updateMicStatus() {
   if (mMediaRecorder != null) {
     double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;
     double db = 0;// 分贝
     if (ratio > 1)
       db = 20 * Math.log10(ratio);
     Log.d(TAG,"分贝值:"+db);
     mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
   }
 }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com