Android之AudioRecord錄音實現

來源:互聯網
上載者:User

標籤:

前言:

      其實在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();        }    }}

 

Android之AudioRecord錄音實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.