zoukankan      html  css  js  c++  java
  • Android音频开发之AudioRecord录音实现

    前言:

          其实在Android中录音可以用MediaRecord录音,操作比较简单。但是不能对音频进行处理。考虑到项目中做的是实时语音只能选择AudioRecord进行录音。

    本文算是对AudioRecord来个回顾:

    public class AudioRecordManager {
        public static final String TAG = "AudioRecordManager";
        private AudioRecord mRecorder;
        private DataOutputStream dos;
        private Thread recordThread;
        private boolean isStart = false;
        private static AudioRecordManager mInstance;
        private  int bufferSize;
    
        public AudioRecordManager() {
            bufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            mRecorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2);
        }
    
        /**
         * 获取单例引用
         * 
         * @return
         */
        public static AudioRecordManager getInstance() {
            if (mInstance == null) {
                synchronized (AudioRecordManager.class) {
                    if (mInstance == null) {
                        mInstance = new AudioRecordManager();
                    }
                }
            }
            return mInstance;
        }
    
        /**
         * 销毁线程方法
         */
        private void destroyThread() {
            try {
                isStart = false;
                if (null != recordThread && Thread.State.RUNNABLE == recordThread.getState()) {
                    try {
                        Thread.sleep(500);
                        recordThread.interrupt();
                    } catch (Exception e) {
                        recordThread = null;
                    }
                }
                recordThread = null;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                recordThread = null;
            }
        }
    
        /**
         * 启动录音线程
         */
        private void startThread() {
            destroyThread();
            isStart = true;
            if (recordThread == null) {
                recordThread = new Thread(recordRunnable);
                recordThread.start();
            }
        }
    
        /**
         * 录音线程
         */
        Runnable recordRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
                    int bytesRecord;
                    //int bufferSize = 320;
                    byte[] tempBuffer = new byte[bufferSize];
                    if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
                        stopRecord();
                        return;
                    }
                    mRecorder.startRecording();
                    //writeToFileHead();
                    while (isStart) {
                        if (null != mRecorder) {
                            bytesRecord = mRecorder.read(tempBuffer, 0, bufferSize);
                            if (bytesRecord == AudioRecord.ERROR_INVALID_OPERATION || bytesRecord == AudioRecord.ERROR_BAD_VALUE) {
                                continue;
                            }
                            if (bytesRecord != 0 && bytesRecord != -1) {
                                //在此可以对录制音频的数据进行二次处理 比如变声,压缩,降噪,增益等操作
                                //我们这里直接将pcm音频原数据写入文件 这里可以直接发送至服务器 对方采用AudioTrack进行播放原数据
                                dos.write(tempBuffer, 0, bytesRecord);
                            } else {
                                break;
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
        };
    
        /**
         * 保存文件
         * 
         * @param path
         * @throws Exception
         */
        private void setPath(String path) throws Exception {
            File file = new File(path);
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            dos = new DataOutputStream(new FileOutputStream(file, true));
        }
    
        /**
         * 启动录音
         * 
         * @param path
         */
        public void startRecord(String path) {
            try {
                setPath(path);
                startThread();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 停止录音
         */
        public void stopRecord() {
            try {
            destroyThread();
                if (mRecorder != null) {
                    if (mRecorder.getState() == AudioRecord.STATE_INITIALIZED) {
                        mRecorder.stop();
                    }
                    if (mRecorder != null) {
                        mRecorder.release();
                    }
                }
            if (dos != null) {
                dos.flush();
                dos.close();
            }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    使用前要添加如下权限:

    <!-- 录音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    相关音频知识链接:

       http://ticktick.blog.51cto.com/823160/1748506

  • 相关阅读:
    Hibernate 补充 ManyToOne、OneToMany、OneToOne的使用例
    Lint found fatal errors while assembling a release target
    5、jeecg 笔记之 minidao 条件判断
    4、jeecg 笔记之 自定义显示按钮 (exp 属性)
    restful api
    我学不动了...
    6、Flutter Error waiting for a debug connection: ProcessException: adb did not report f(转)
    5、Flutter 实现 ViewPager、bottomNavigationBar 界面切换
    4、Flutter 采坑记录篇二_依赖库不兼容
    3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5477216.html
Copyright © 2011-2022 走看看