Android多媒體框架支援捕獲和編碼各種常見的音訊和視訊格式。如果裝置硬體支援,您可以使用MediaRecorder api。
本文件向您展示瞭如何使用MediaRecorder編寫一個應用程式,該應用程式從裝置麥克風捕獲音訊,儲存音訊並回放(使用MediaPlayer)。要錄製視訊,你需要使用裝置的攝像頭和MediaRecorder。這是在Camera指南中描述的。
注意:Android模擬器無法錄製音訊。一定要在可以錄製的真實裝置上測試程式碼。
請求允許錄製音訊
為了能夠錄製,你的應用程式必須告訴使用者它將訪問裝置的音訊輸入。你必須在應用程式的清單檔案中包含這個許可權標籤:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
複製程式碼
RECORD_AUDIO
被認為是一個“危險的”許可權,因為它可能會對使用者的隱私構成威脅。從Android 6.0 (API level 23)開始,使用危險許可權的應用程式必須在執行時請求使用者批准。使用者獲得許可後,應用程式應記住並不再詢問。使用ActivityCompat.requestPermissions()實現此行為。
建立和執行一個MediaRecorder
用以下呼叫初始化MediaRecorder的新例項:
- 使用setAudioSource()設定音訊源。你可能會用麥克風。
注意:大多數音訊源(包括DEFAULT)會對音訊訊號進行處理。要錄製原始音訊選擇UNPROCESSED。有些裝置不支援未處理的輸入。首先呼叫AudioManager.getProperty(AudioManager.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)以驗證其可用性。如果不是,嘗試使用VOICE_RECOGNITION替代,它不使用AGC或噪聲抑制。即使不支援屬性,也可以將未處理的訊號用作音訊源,但在這種情況下,無法保證訊號是否會被未處理。
- 使用setOutputFormat()設定輸出檔案格式。注意,從Android 8.0 (API級別26)開始MediaRecorder支援MPEG2_TS格式,這對於流媒體很有用:
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
複製程式碼
- 使用setOutputFile()設定輸出檔名。必須指定表示實際檔案的檔案描述符。
- 使用setAudioEncoder()設定音訊編碼器。
- 通過呼叫prepare()來完成初始化。
分別呼叫Start()和stop()來啟動和停止記錄器。
用完MediaRecorder例項後,通過呼叫release()儘快釋放其資源。
注意:在執行Android 9 (API level 28)或更高的裝置上,後臺執行的應用程式無法訪問麥克風。因此,您的應用程式應該只在前臺或前臺服務中包含MediaRecorder例項時錄製音訊。
使用MediaMuxer錄製多個通道
從Android 8.0 (API級別26)開始,您可以使用MediaMuxer錄製多個同步音訊和視訊流。在早期的Android版本中,你一次只能錄製一個音軌和/或一個視訊軌。
使用addTrack()方法將多軌道混合在一起。
您還可以為每個frame新增一個或多個metadata跟蹤,並提供定製資訊,但僅限於MP4容器。您的應用程式定義後設資料的格式和內容。
新增metadata
metadata可以用於離線處理。例如,從陀螺感測器捕獲的資料可以用來穩定視訊。
當新增metadata跟蹤時,跟蹤的mime格式必須以字首‘application/’
開始。編寫metadata與編寫視訊或音訊資料是一樣的,只是資料不是來自MediaCodec。相反,應用程式將帶有相關時間戳的ByteBuffer傳遞給writeSampleData()方法。時間戳必須與視訊和音訊軌道在同一時間基礎上。
生成的MP4檔案使用ISO BMFF規範12.3.3.2節中定義的TextMetaDataSampleEntry
作為metadata的mime格式的訊號。當您使用MediaExtractor提取包含metadata跟蹤的檔案時,metadata的mime格式將作為MediaFormat的例項出現。
示例程式碼
Android MediaRecorder示例演示瞭如何使用MediaRecorder和Camera API進行視訊錄製。