zoukankan      html  css  js  c++  java
  • Android 录音获取分贝值的办法

    参考:http://blog.csdn.net/greatpresident/article/details/38402147

    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);  
            }  
        }  
    }  
  • 相关阅读:
    ASP.NET从字符串中查找字符出现次数的方法
    2009最新Godaddy域名Push教程(GODADDY域名转移会员号)
    jQueryJSON 无刷新三级联动
    select scope_identity()
    BugTracker.NET安装指南
    这道面试必问的JVM面试题70%的Java程序员会做错
    想要金九银十面试通关,不懂 Java多线程肯定是不行的!
    一线互联网公司Redis使用精髓,你必须要掌握这4点!
    5种JVM垃圾收集器特点和8种JVM内存溢出原因
    一次性集中处理大量数据的定时任务,如何缩短执行时间?
  • 原文地址:https://www.cnblogs.com/lipeil/p/4361008.html
Copyright © 2011-2022 走看看