Android實作錄音功能彙總
-
- 一、目标
- 二、錄音效果比較
- 三、MediaRecorder
- 四、參考文章
- 五、開源項目
- 六、同時使用MediaRecorder和AudioRecord
- 七、調用第三方應用錄音
- 八、調研過程回顧
- 九、Finally
神馬筆記新的版本準備加入錄音功能。
一、目标
為神馬筆記加入錄音功能做技術儲備。
二、錄音效果比較
比較了MediaRecorder和AudioRecord的錄音效果,嘗試了音樂和人聲。
最終的結論是二者差别不大,沒有太明顯的差別。
畢竟底層的實作是一樣的,隻是對PCM資料的處理有些許差别。
- 音源
參數名 | 參數值 |
---|---|
歌曲 | 身騎白馬-黃小琥 |
輸出裝置 | 堅果 Pro2 |
輸入裝置 | 榮耀暢玩7 |
錄音方式 | 兩部手機并排錄音 |
- 參數
參數名 | 參數值 |
---|---|
OutputFormat | MediaRecorder.OutputFormat.MPEG_4 |
AudioEncoder | MediaRecorder.AudioEncoder.AAC |
AudioChannels | 1 |
AudioSamplingRate | 44100 |
AudioEncodingBitRate | 128000 |
- 比較結果
錄音方式 | 開源項目 | 結果 |
---|---|---|
MediaRecorder | dkim0419 / SoundRecorder | 平分秋色 |
AudioRecord | google / ringdroid | 不相伯仲 |
三、MediaRecorder
MediaRecorder
相關參數和方法一覽。
- AudioSource
常量 | 描述 |
---|---|
AUDIO_SOURCE_INVALID | |
DEFAULT | |
MIC | 麥克風 |
VOICE_UPLINK | |
VOICE_DOWNLINK | |
VOICE_CALL | |
CAMCORDER | |
VOICE_RECOGNITION | |
VOICE_COMMUNICATION | |
REMOTE_SUBMIX | |
UNPROCESSED | |
RADIO_TUNER | |
HOTWORD |
- OutputFormat
常量 | 描述 |
---|---|
DEFAULT | |
THREE_GPP | |
MPEG_4 | |
RAW_AMR | |
AMR_NB | |
AMR_WB | |
AAC_ADIF | |
AAC_ADTS | |
OUTPUT_FORMAT_RTP_AVP | |
MPEG_2_TS | |
WEBM |
- AudioEncoder
常量 | 描述 |
---|---|
DEFAULT | |
AMR_NB | |
AMR_WB | |
AAC | |
HE_AAC | |
AAC_ELD | |
VORBIS |
- 其他參數設定
方法 | 描述 |
---|---|
setAudioChannels(int numChannels) | |
setAudioEncodingBitRate(int bitRate) | |
setAudioSamplingRate(int samplingRate) | 建議:16000 |
setOutputFile(String path) setOutputFile(File file) setOutputFile(FileDescriptor fd) | |
setOnErrorListener(OnErrorListener l) | |
setOnInfoListener(OnInfoListener listener) |
四、參考文章
文章 | 描述 |
---|---|
Android錄制音頻的三種方式 | 1. 第三方應用 2. MediaRecorder 3. AudioRecord |
Android 錄音MediaRecorder到AudioRecord | 比較了2種錄音的實作方式,并提供了WAV轉AAC的實作方式。 體積這麼小而且這麼友善,很大的一個缺點,也是我放棄的理由,就是錄下的音質不太好,總感覺被什麼籠罩着在。 |
Android實時擷取音量(機關:分貝) | 介紹了錄音時2種方式擷取實時音量 |
MediaRecorder和AudioRecord錄音與MediaPlayer和AudioTrack播放差別 | MediaRecorder與AudioRecord在底層代碼是一緻的,隻是MediaRecorder提供了更高層的封裝。 |
MediaRecorder和AudioRecord的差別和聯系 | |
音頻采樣位數,采樣率,比特率 |
五、開源項目
開源項目 | 實作方式 | 描述 |
---|---|---|
google / ringdroid | AudioRecord | Ringdroid is an Android application for recording and editing sounds, and creating ringtones, directly on the handset. Supported file formats right now include: MP3 AAC/MP4 (including unprotected iTunes music) WAV 3GPP/AMR (this is the format used when you record sounds directly on the handset) OGG |
mkjihu / AudioWaveViewEdit | AudioRecord | 讀取手機上有的音檔 滑動自訂 裁剪音檔區間 可錄音暫停後繼續錄音 錄音同時繪製波型圖 使用google / ringdroid核心代碼,并增強之 |
Arjun-sna / Android-AudioRecorder-App | AudioRecord | 完整的錄音應用。 |
cokuscz / audioWaveCanvas | AudioRecord | 錄音并實時繪制波形圖。 |
dkim0419 / SoundRecorder | MediaRecorder | |
renhui / AudioDemo | MediaRecorder | 示範了使用AudioRecord錄音,并儲存為wav檔案。 |
developerHaoz / SoundRecorderUtils | MediaRecorder | 封裝成Service |
lassana / continuous-audiorecorder | MediaRecorder | 支援暫停 |
gelitenight / WaveView | 繪制波浪動畫 | |
Jay-Goo / WaveLineView | 波浪線動畫 | |
google / ExoPlayer | 播放器,不包含錄音 |
六、同時使用MediaRecorder和AudioRecord
相同的代碼在不同裝置表現不一緻。
結果不可控,不要同時使用。
- MediaRecorder first
裝置 | 版本 | 結果 |
---|---|---|
榮耀暢玩7 | 8.1 | Media分貝值:15.563025007672874 Audio分貝值:-Infinity Media分貝值:26.848453616444125 Audio分貝值:-Infinity Media分貝值:33.25515663363148 Audio分貝值:-Infinity …… |
紅米6 Pro | 9.0 | Media分貝值:27.60422483423212 Audio分貝值:28.706397912918934 Media分貝值:37.14664992862537 Audio分貝值:30.6302592206421 Media分貝值:38.276277047674334 Audio分貝值:28.778489726586123 …… |
- AudioRecord first
裝置 | 版本 | 結果 |
---|---|---|
榮耀暢玩7 | 8.1 | E/MediaRecorder: start failed: -38 java.lang.IllegalStateException |
紅米6 Pro | 9.0 | Audio分貝值:31.155938717202027 Media分貝值:33.06425027550687 Audio分貝值:32.32133729412097 Media分貝值:38.276277047674334 Audio分貝值:32.98663099227764 Media分貝值:40.506117305295405 …… |
七、調用第三方應用錄音
- 啟動第三方應用
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
try {
startActivityForResult(intent, REQUEST_RECORDER);
} catch (Exception e) {
}
- 處理結果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && REQUEST_RECORDER == requestCode){
uri = data.getData();
}
}
裝置 | 結果 | 截圖 |
---|---|---|
Android模拟器 | | |
榮耀暢玩7 | content://media/external/audio/media/2979 | |
紅米6 Pro | content://media/external/file/125654 |
八、調研過程回顧
- Android實作錄音的3種方式
- 使用Intent調用第三方應用
- MediaRecorder
- AudioRecord
考慮到可能不存在第三方錄音應用,以及錄音應用的多樣性。為儲存使用者體驗的一緻性,排除第三方應用的方式。
- MediaRecorder和AudioRecord比較
MediaRecorder | AudioRecord | |
---|---|---|
錄音效果 | 平分秋色 | 不相伯仲 |
音源資料 | 沒有,轉碼後直接儲存到檔案。 | PCM資料,需要自己轉碼。 可以使用 進行編碼解碼,詳情參考google / ringdroid。 |
音頻編碼 | 設定即可 | 需要自己實作 |
緩存 | 無需關心 | 需要自己處理,或者直接将PCM資料寫入檔案 |
- 結論
鑒于二者的錄音效果并沒有明顯差別。
考慮神馬筆記的使用場景,并不會對過程中的音頻資料進行處理,而隻關心最終的錄音結果。
是以,MediaRecorder已經足夠使用。
未來如果需要處理音頻資料,可以使用
MediaCodec
進行編碼解碼,或者使用Native方式。
九、Finally
以實無有法。得阿耨多羅三藐三菩提。
是故然燈佛與我授記。作是言。
汝于來世。當得作佛。号釋迦牟尼。