前言:android
其實在Android中錄音能夠用MediaRecord錄音,操做比較簡單。可是不能對音頻進行處理。考慮到項目中作的是實時語音只能選擇AudioRecord進行錄音。服務器
本文算是對AudioRecord來個回顧:ide
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(); } } }
使用前要添加以下權限:spa
<!-- 錄音權限 -->
<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/1748506code