Android使用AudioRecord實現錄音功能
前言
Android使用AudioRecord實現錄音
提示:以下是本篇文章正文內容,下面案例可供參考
一、AudioRecord使用
Android平臺可以使用AudioRecord和MediaRecorder來實現錄音,因為AudioRecord更接近底層,並且錄制的數據為原始(pcm)數據,pcm數據可以再進行處理轉換,直播中使用的都是處理後的pcm數據,所以在這裡面學習下使用AudioRecord。
- 構造AudioRecord
AudioRecord類的構造方法中有5個參數
/** * audioSource 表示數據來源 一般為麥克風 MediaRecorder.AudioSource.MIC * sampleRateInHz 表示采樣率 一般設置為 44100 * channelConfig 表示聲道 一般設置為 AudioFormat.CHANNEL_IN_MONO * audioFormat 數據編碼方式 這裡使用 AudioFormat.ENCODING_PCM_16BIT * bufferSizeInBytes 數據大小 這裡使用AudioRecord.getMinBufferSize 獲取 */ AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
- 創建AudioRecord對象
private AudioRecord audioRecord = null; private int recordBufsize = 0; private void createAudioRecord() { recordBufsize = AudioRecord .getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufsize); }
- 開始錄音
// 調用開始錄音 audioRecord.startRecording();
調用開始錄音後,需要從audioRecord中讀取錄音的數據
audioRecord.read(data, 0, recordBufsize);
- 結束錄音
audioRecord.stop();
- 釋放資源
audioRecord.release();
AudioRecord的關鍵方法已經介紹瞭,下面貼上完整的代碼
二、使用步驟
清單文件聲明權限
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
關於Android 6.0動態申請權限這裡就不重復瞭,可自行百度
完整代碼
public class MainActivity extends AppCompatActivity { private static final String FILE_NAME = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + "test.pcm"; private AudioRecord audioRecord = null; private int recordBufsize = 0; private boolean isRecording = false; private Button startRecordBtn; private Button stopRecordBtn; private Thread recordingThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000); } if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 2000); } startRecordBtn = findViewById(R.id.start_record_btn); stopRecordBtn = findViewById(R.id.stop_record_btn); createAudioRecord(); startRecordBtn.setOnClickListener(v -> { startRecord(); }); stopRecordBtn.setOnClickListener(v -> { stopRecord(); }); } private void createAudioRecord() { recordBufsize = AudioRecord .getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); Log.i("audioRecordTest", "size->" + recordBufsize); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufsize); } private void startRecord() { if (isRecording) { return; } isRecording = true; audioRecord.startRecording(); Log.i("audioRecordTest", "開始錄音"); recordingThread = new Thread(() -> { byte data[] = new byte[recordBufsize]; File file = new File(FILE_NAME); FileOutputStream os = null; try { if (!file.exists()) { file.createNewFile(); Log.i("audioRecordTest", "創建錄音文件->" + FILE_NAME); } os = new FileOutputStream(file); } catch (Exception e) { e.printStackTrace(); } int read; if (os != null) { while (isRecording) { read = audioRecord.read(data, 0, recordBufsize); if (AudioRecord.ERROR_INVALID_OPERATION != read) { try { os.write(data); Log.i("audioRecordTest", "寫錄音數據->" + read); } catch (IOException e) { e.printStackTrace(); } } } } try { os.close(); } catch (IOException e) { e.printStackTrace(); } }); recordingThread.start(); } private void stopRecord() { isRecording = false; if (audioRecord != null) { audioRecord.stop(); Log.i("audioRecordTest", "停止錄音"); audioRecord.release(); audioRecord = null; recordingThread = null; } } }
佈局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/start_record_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="開始錄音" /> <Button android:id="@+id/stop_record_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="結束錄音" /> </LinearLayout>
運行程序,點擊開始錄音,本地會創建test.pcm文件並寫入錄音數據。
總結
通過上面的學習,對AudioRecord有初步的瞭解,能使用AudioRecord來實現錄音功能保存到本地。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Android實現邊錄邊播功能
- Android實現邊錄邊播應用
- Android實現自動朗讀功能(TTS)
- Android音頻開發之錄制音頻(WAV及MP3格式)
- Android移動應用開發指南之六種佈局詳解