MediaRecorder测量音量大小

简介:


1.      
2.MediaRecorder mMediaRecorder;  
3.int ratio = mMediaRecorder.getMaxAmplitude() / BASE;  
4.int db = 0;// 分贝 也可以理解为定义的音量大小  
5.if (ratio > 1)  
6.db = (int) (20 * Math.log10(ratio));//db就是我们需要取得的音量的值。  
7.//(int) (20 * Math.log10(ratio))振幅和音量大小的公式  
8.//BASE的值由自己测试获得,我是怎么获取这个值得呢?  
9.//开启麦克风,不对麦克风说话,而由周围噪声获取的值  大概在300到600之间  我取得是600这个基准值。  

一下是一部分应用的代码: 


1.package com.taobao.baby.manager;  
2.  
3.import java.io.File;  
4.import java.io.IOException;  
5.  
6.import com.taobao.baby.R;  
7.import com.taobao.baby.util.Log;  
8.import android.media.MediaRecorder;  
9.import android.os.Handler;  
10.import android.widget.ImageView;  
11.  
12./** 
13. * amr音频处理 
14. *  
15. * @author hongfa.yy 
16. * @version 创建时间2012-11-21 下午4:33:28 
17. */  
18.public class RecordManager {  
19.    private final String TAG = "RecordManager";  
20.    private MediaRecorder mMediaRecorder;  
21.    public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;  
22.    private File file;  
23.  
24.    public RecordManager(File file,ImageView view) {  
25.        this.file = file;  
26.        this.view=view;  
27.    }  
28.    public RecordManager(File file) {  
29.        this.file = file;  
30.    }  
31.  
32.    private long startTime;  
33.    private long endTime;  
34.  
35.    /** 
36.     * 开始录音 使用amr格式 
37.     *  
38.     * @param mRecAudioFile 
39.     *            录音文件 
40.     * @return 
41.     */  
42.    public void startRecord() {  
43.        // 开始录音  
44.        /* ①Initial:实例化MediaRecorder对象 */  
45.        if (mMediaRecorder == null)  
46.            mMediaRecorder = new MediaRecorder();  
47.        try {  
48.            /* ②setAudioSource/setVedioSource */  
49.            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风  
50.            /* 
51.             * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式 
52.             * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) 
53.             */  
54.            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);  
55.            /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */  
56.            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);  
57.            /* ③准备 */  
58.            mMediaRecorder.setOutputFile(file.getAbsolutePath());  
59.            mMediaRecorder.setMaxDuration(MAX_LENGTH);  
60.            mMediaRecorder.prepare();  
61.            /* ④开始 */  
62.            mMediaRecorder.start();  
63.            // AudioRecord audioRecord.  
64.            /* 获取开始时间* */  
65.            startTime = System.currentTimeMillis();  
66.            // pre=mMediaRecorder.getMaxAmplitude();  
67.            updateMicStatus();  
68.            Log.i("ACTION_START", "startTime" + startTime);  
69.        } catch (IllegalStateException e) {  
70.            Log.i(TAG,  
71.                    "call startAmr(File mRecAudioFile) failed!"  
72.                            + e.getMessage());  
73.        } catch (IOException e) {  
74.            Log.i(TAG,  
75.                    "call startAmr(File mRecAudioFile) failed!"  
76.                            + e.getMessage());  
77.        }  
78.  
79.    }  
80.  
81.    /** 
82.     * 停止录音 
83.     *  
84.     * @param mMediaRecorder 
85.     */  
86.    public long stopRecord() {  
87.        if (mMediaRecorder == null)  
88.            return 0L;  
89.        endTime = System.currentTimeMillis();  
90.        Log.i("ACTION_END", "endTime" + endTime);  
91.        mMediaRecorder.stop();  
92.        mMediaRecorder.reset();  
93.        mMediaRecorder.release();  
94.        mMediaRecorder = null;  
95.        Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));  
96.        return endTime - startTime;  
97.    }  
98.  
99.    private final Handler mHandler = new Handler();  
100.    private Runnable mUpdateMicStatusTimer = new Runnable() {  
101.        public void run() {  
102.            updateMicStatus();  
103.        }  
104.    };  
105.  
106.    /** 
107.     * 更新话筒状态 分贝是也就是相对响度 分贝的计算公式K=20lg(Vo/Vi) Vo当前振幅值 Vi基准值为600:我是怎么制定基准值的呢? 当20 
108.     * * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的时候vi就是我所需要的基准值 
109.     * 当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。 
110.     * Log.i("mic_", "麦克风的基准值:" + mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话 
111.     */  
112.    private int BASE = 600;  
113.    private int SPACE = 300;// 间隔取样时间  
114.    private ImageView view;  
115.  
116.    private void updateMicStatus() {  
117.        if (mMediaRecorder != null && view != null) {  
118.            // int vuSize = 10 * mMediaRecorder.getMaxAmplitude() / 32768;  
119.            int ratio = mMediaRecorder.getMaxAmplitude() / BASE;  
120.            int db = 0;// 分贝  
121.            if (ratio > 1)  
122.                db = (int) (20 * Math.log10(ratio));  
123.            switch (db / 4) {  
124.            case 0:  
125.                view.setImageBitmap(null);  
126.                break;  
127.            case 1:  
128.                view.setImageResource(R.drawable.audio_recorder_volume_1);  
129.                break;  
130.            case 2:  
131.                view.setImageResource(R.drawable.audio_recorder_volume_2);  
132.                break;  
133.            case 3:  
134.                view.setImageResource(R.drawable.audio_recorder_volume_3);  
135.                break;  
136.            case 4:  
137.                view.setImageResource(R.drawable.audio_recorder_volume_4);  
138.                break;  
139.            case 5:  
140.                view.setImageResource(R.drawable.audio_recorder_volume_5);  
141.                break;  
142.            default:  
143.                view.setImageResource(R.drawable.audio_recorder_volume_5);  
144.                break;  
145.            }  
146.            mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);  
147.            /* 
148.             * if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_", 
149.             * "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0); 
150.             */  
151.        }  
152.    }  
153.  
154.}  

相关文章
|
8月前
|
存储 Linux API
解析音频输出调节音量的原理以及调节的方法
解析音频输出调节音量的原理以及调节的方法
706 0
|
编解码
vlc可以播放这个m3u8但是LivePlayer只有声音没画面
vlc可以播放这个m3u8但是LivePlayer只有声音没画面
1764 0
|
存储 算法 数据可视化
Android 音频(一) | 采样量化编码 & AudioRecord 录制音频
Android 音频(一) | 采样量化编码 & AudioRecord 录制音频
2069 0
|
编解码 Shell API
MediaPlayer音频与视频的播放介绍
Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流)对于Android所支持的的媒体格式列表 1.相关方法详解 1)获得MediaPlayer实例: 可以直接new或者调用create方法创建: MediaPlayer mp = new MediaPlayer(); MediaPlayer mp = MediaPlaye
173 0
88.播放声音和音效
88.播放声音和音效
278 0
88.播放声音和音效
|
Web App开发 机器学习/深度学习 算法
AliAGC 自动增益控制算法:解决复杂场景下的音量问题
极大改善不同环境、设备、场景下音量不统一的问题
10432 1
AliAGC 自动增益控制算法:解决复杂场景下的音量问题
AVAudioPlayer播放音频文件时没声音
AVAudioPlayer播放一个mp3文件时,居然没有声音。mp3文件是放在工程里面的,路径没有错误但就是死活没有声音。 func playSound() { let notifyUrl = NSBundle.
1746 0
|
C++ 内存技术
C++ 调节PCM音频音量大小
在用解码器解码音频数据得到PCM音频数据块之后,可以在将数据送给声卡播放之前调节其音量大小,具体的实现函数如下:   [cpp] view plain copy   void RaiseVolume(char* buf, UINT32 size, UINT32 uRepe...
3157 0