2014年3月11日 星期二

iOS -- 錄音功能實作

近日針對 iOS 設備的錄音功能做一研究,整理如下:

一、聲音來源

錄音時,其聲音來源可能有以下兩處,
  • 麥克風
  • 正在播放的音頻資料(可能來自本地端的檔案,或是遠端的音頻資料)
可以分別選擇不同來源進行錄音,也可以將兩種聲音進行 mix



二、錄製麥克風聲音的方法:

AVAudioRecorder: 
若要將聲音直接錄製成一個檔案,可選擇此方式。 
AudioQueue: 
若要將聲音錄製成一段緩衝區,則選擇此方式,若你所開發的是類似網路電話的服務,建議是採用此方式。 
針對上述兩種方式,我寫了一個簡單的錄音範例程式提供參考。

三、錄製正在播放的音頻資料的方法:

首先需要知道這些音頻資料是由哪個角色進行播放, 
若是自行撰寫一個 app 同時進行播放與錄音,因為音頻資料是由app自行控制,因此只需要使用 Audio Converter Services 將音頻轉換成欲儲存的格式,之後透過 Audio File Service 直接寫入檔案即可。此部分可參考Audio Converter File Convert Test,直接改寫 AudioConverterFileConvert.cpp 即可。 
若是要錄製系統中其他app所播放的聲音,此時試圖錄音的app便需要設法取得此時系統正在播放的音頻資料,並進行音頻資料轉換,之後存檔。

現在我遇到的問題是不知道該如何取得系統中正在播放的聲音。
若有人知道該怎麼做的話,請教教我,謝謝。

20140414 自問自答:藉由下列步驟應該可以取得系統中正要播放的聲音。
  • 使用 I/O type 的 Audio Unit,
  • 將 output element 的 output scope 設定為喇叭
  • 將 output element 的 input scope 設定為 CallBackFunction
  • 由於整個 Audio Routing Path 的最後一站便是喇叭,因此在 CallBackFunction 應該有機會取得正要送往麥克風的資料。


參考資料: