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

来源:互联网 发布:淘宝女装货源哪里好 编辑:程序博客网 时间:2024/05/01 05:23

这篇文章主要介绍了Android录音时获取分贝值的方法代码实例,本文直接给出核心实现代码,需要的朋友可以参考下


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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public class MediaRecorderDemo {
  privatefinal String TAG = "MediaRecord";
  privateMediaRecorder mMediaRecorder;
  publicstatic final int MAX_LENGTH = 1000* 60 * 10;// 最大录音时长1000*60*10;
  privateString filePath;
  
  publicMediaRecorderDemo(){
    this.filePath ="/dev/null";
  }
  
  publicMediaRecorderDemo(File file) {
    this.filePath = file.getAbsolutePath();
  }
  
  privatelong startTime;
  privatelong endTime;
  
  /**
   * 开始录音 使用amr格式
   *
   *      录音文件
   * @return
   */
  publicvoid 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();
    }
  };
  
  /**
   * 更新话筒状态
   *
   */
  privateint BASE = 1;
  privateint SPACE = 100;// 间隔取样时间
  
  privatevoid updateMicStatus() {
    if(mMediaRecorder != null) {
      doubleratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;
      doubledb = 0;// 分贝
      if(ratio > 1)
        db =20 * Math.log10(ratio);
      Log.d(TAG,"分贝值:"+db);
      mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
    }
  }
}

0 0