extends:http://blog.csdn.net/alvinhuai/article/details/8955127,http://mikespook.com/2010/11/android-%E5%AE%9E%E6%97%B6%E8%8E%B7%E5%8F%96%E9%BA%A6%E5%85%8B%E9%A3%8E%E8%BE%93%E5%85%A5%E9%9F%B3%E9%87%8F%E7%9A%84%E4%BB%A3%E7%A0%81/

前几天做一个关于录音并获取音量大小的模块,今天写一个demo和大家分享。如果有各位有更好的方法可以留言提醒我,谢谢。

首先录音功能很容易实现,通过audiorecord或者mediarecorder都可以实现,如果要获取录音音量的大小,用audiorecord更加方便。实现录音功能可以大致分为几个步骤。一 初始化录音设备audiorecord。 二 ,开启一个线程实现录音功能。 三 获取录音的音频流对它的大小进行分析。四 将大小传递至主线程使UI做出相应的改变。

首先初始化audiorecord 。AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes) ,初始化需要五个参数,audiosource 是指录制源在此我们选择麦克风:MediaRecorder.AudioSource.MIC。  sampleRateInHz 默认采样频率,以赫兹为单位,官方文档说44100 为目前所有设备兼容,但是如果用模拟器测试的话会有问题,所以有的也用8000。  channelConfig ,  描述音频通道设置 CHANNEL_IN_MONO保证能在所有设备上工作。audioFormat 音频流的格式,分为16bit 或8bit目前都支持的是ENCODING_PCM_16BIT.  bufferSizeInBytes 在录制过程中,音频数据写入缓冲区的总数(字节)。 从缓冲区读取的新音频数据总会小于此值. 这个值一般通过getMinBufferSize来获取。getMinBufferSize的参数可以参照audiorecord的构造函数。在oncreate中执行一下代码。

try {
                mMinibuffer = AudioRecord.getMinBufferSize(sampleRates,
                                AudioFormat.CHANNEL_IN_MONO,
                                AudioFormat.ENCODING_PCM_16BIT);
                if(mMinibuffer != AudioRecord.ERROR_BAD_VALUE){
                        mRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                      sampleRates[i],
                                      AudioFormat.CHANNEL_IN_MONO,
                                      AudioFormat.ENCODING_PCM_16BIT,
                                      mMinibuffer);
                }
            } catch (IllegalArgumentException e) {
                ;
            }

这是audiorecord的初始化,下面可以实现录音

public class RecordThread extends Thread{
        private boolean mIsRun = false;
        public RecordThread(){
            super();
        }
        public void run(){
            super.run();
            MainActivity.this.mRecord.startRecording();
            byte[]  byte_buffer = new byte[mMinibuffer];
            mIsRun = true;
            while(mIsRun){
                int r = mRecord.read(byte_buffer,0,mMinibuffer);
                int mShortArrayLenght = r/2;
                short[] short_buffer = new short[mShortArrayLenght];
                short_buffer = byteArrayToShortArray(byte_buffer,mShortArrayLenght);
                int max =  0;
                if(r > 0){
                    for(int i=0; i<mShortArrayLenght; i++){
                        if(Math.abs(short_buffer[i]) > max){
                            max = Math.abs(short_buffer[i]);
                        }
                    }
                    Bundle mBundle = new Bundle();
                    mBundle.putInt(mSendData, max);
                    Message Msg = new Message();
                    Msg.what = RECORDSTATE;
                    Msg.setData(mBundle);
                    mHandler.sendMessage(Msg);
                }
            }
            MainActivity.this.mRecord.stop();
            mHandler.sendEmptyMessage(NULLBUFFER);
        }

public void stopRecord(){
            mIsRun = false;
        }
    }

这里是写一个线程实现录音功能。byte_buffer  保存录制的音频流,因为每次录制次数很多,我暂时将每次录音的最大值当作这次录音的音量,然后通过handler将最大值返回给主线程。如果需要停止这个线程可以通过调用这个线程函数 stopRecord(); 然后我们通过每次得到的音量值,可以通过view的ondraw函数,将音量变化动态的画出来。具体代码不全贴出来的,主要讲一下这个思想。 如果有人需要可以直接留言给我, 可以发给大伙。

Android 获取 AudioRecord 麦克风音量大小并做选择性发送的更多相关文章

  1. Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()

    getWindowVisibleDisplayFrame()方法 getWindowVisibleDisplayFrame()是View类下的一个方法,从方法的名字就可以看出,它是用来获取当前窗口可视 ...

  2. Android 获取SD路径,存储空间大小的方法

    Android用 Environment.getExternalStorageDirectory() 方法获取 SD 卡的路径 , 卡存储空间大小及已占用空间获取方法 : /* 获取存储卡路径 */ ...

  3. Android 获取麦克风的音量(分贝)

    基础知识 度量声音强度.大家最熟悉的单位就是分贝(decibel,缩写为dB).这是一个无纲量的相对单位.计算公式例如以下: 分子是測量值的声压,分母是參考值的声压(20微帕.人类所能听到的最小声压) ...

  4. Android 麦克风录音带音量大小动态显示的圆形自定义View

    1.所谓无图无真相,先上效果图.我们要实现的就是中间那个录音的按钮,周边会显示一圈音量大小的波形 2.VolumCircleBar继承自View,我们进行了自定义,代码如下 package com.r ...

  5. [Android Pro] 关于inputStream.available()方法获取文件的总大小

    reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调 ...

  6. Android开发——获取应用数据/缓存大小并清理缓存

    1. 获取应用数据/缓存大小 其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用.因此需要开启子线程进行处理. 还有需要注意的是,在Android4.2之前getPacka ...

  7. android 获取文件夹、文件的大小 以B、KB、MB、GB 为单位

    android 获取文件夹.文件的大小 以B.KB.MB.GB 为单位   public class FileSizeUtil { public static final int SIZETYPE_B ...

  8. Android 获取屏幕大小和密度

    Android 获取屏幕大小和密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay ...

  9. Android获取屏幕大小和设置无标题栏

    android获取屏幕大小非常常用,例如写个程序,如果要做成通用性很强的程序,适用屏幕很强,一般布局的时候都是根据屏幕的长宽来定义的,所以我把这个总结一下,方便日后忘记的时候查阅.还有就是有时候写程序 ...

随机推荐

  1. USACO 1.3 Wormholes

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  2. linux版本选择

    桌面系统           -- Ubuntu,开发人员也喜欢用Ubuntu 服务器端           -- RHEL或CentOS,RHEL要钱 对安全要求很高  -- Decian或Free ...

  3. C socket指南

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

  4. html5存储相关 coookie localstorage session storage

    html5存储 coookie  localstorage   session storage

  5. 一行一行分析JQ源码学习笔记-06

    节点类型获取$("span")首先 判断 if(select.nodeType) markarray() 类数组 转化成真正的数组 var adiv = document.getE ...

  6. 大数加法(STL list)

    #include<iostream> #include<list> #include<string> using namespace std; int main() ...

  7. 监控自定义信息 —— ESFramework 4.0 快速上手(10)

    在ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中,我们介绍了通过挂接IMessageSpy到骨架流程,我们就可以监控到所有收发的消息.由于Rapid引擎已经为我们组装 ...

  8. Openjudge-计算概论(A)-单词翻转

    描述: 输入一个句子(一行),将句子中的每一个单词翻转后输出. 输入只有一行,为一个字符串,不超过500个字符.单词之间以空格隔开.输出翻转每一个单词后的字符串,单词之间的空格需与原文一致. 样例输入 ...

  9. def语句常见错误

    自觉不才,使用def语句时容易出现以下错误, 参考: 习题—25 http://www.2cto.com/shouce/Pythonbbf/ex25.html def add(): print &qu ...

  10. 设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak,证明:11|n的充分必要条件是11|T(n);(整除理论1.1.2))

    设正整数n的十进制表示为n=ak……a1a0(0<=ai<=9,0<=i<=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak, ...