天天看點

Android實作錄音功能彙總

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模拟器

ActivityNotFoundException

Android實作錄音功能彙總
榮耀暢玩7 content://media/external/audio/media/2979
Android實作錄音功能彙總
紅米6 Pro content://media/external/file/125654
Android實作錄音功能彙總

八、調研過程回顧

  • Android實作錄音的3種方式
  1. 使用Intent調用第三方應用
  2. MediaRecorder
  3. AudioRecord

考慮到可能不存在第三方錄音應用,以及錄音應用的多樣性。為儲存使用者體驗的一緻性,排除第三方應用的方式。

  • MediaRecorder和AudioRecord比較
MediaRecorder AudioRecord
錄音效果 平分秋色 不相伯仲
音源資料 沒有,轉碼後直接儲存到檔案。

PCM資料,需要自己轉碼。

可以使用

MediaCodec

進行編碼解碼,詳情參考google / ringdroid。
音頻編碼 設定即可 需要自己實作
緩存 無需關心 需要自己處理,或者直接将PCM資料寫入檔案
  • 結論

鑒于二者的錄音效果并沒有明顯差別。

考慮神馬筆記的使用場景,并不會對過程中的音頻資料進行處理,而隻關心最終的錄音結果。

是以,MediaRecorder已經足夠使用。

未來如果需要處理音頻資料,可以使用

MediaCodec

進行編碼解碼,或者使用Native方式。

九、Finally

以實無有法。得阿耨多羅三藐三菩提。

是故然燈佛與我授記。作是言。

汝于來世。當得作佛。号釋迦牟尼。

繼續閱讀