android 实现录音代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值