2016-08-26 151 views
2

我有一個Android項目,通過麥克風緩衝區中的PCM數據讀取short[]陣列進行實時分析。我需要將此功能轉換爲iOS Swift。在Android中是非常簡單的,看起來像這樣..IOS Swift讀取PCM緩衝區

import android.media.AudioFormat; 
import android.media.AudioRecord; 
... 
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, someSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize(...)); 
recorder.startRecording(); 

後,我閱讀

recorder.read(data, offset, length); //data is short[] 

緩存(這就是我要找的)

文檔:https://developer.android.com/reference/android/media/AudioRecord.html

我對Swift和iOS非常陌生。我已經閱讀了大量有關AudioToolkit,Core以及其他的文檔。我發現的只是C++/Obj-C和Bridging Swift Header解決方案。這對我來說很先進和過時。

現在我可以讀取PCM-數據爲CAF-文件與AVFoundation

settings = [ 
     AVLinearPCMBitDepthKey: 16 as NSNumber, 
     AVFormatIDKey: Int(kAudioFormatLinearPCM), 
     AVLinearPCMIsBigEndianKey: 0 as NSNumber, 
     AVLinearPCMIsFloatKey: 0 as NSNumber, 
     AVSampleRateKey: 12000.0, 
     AVNumberOfChannelsKey: 1 as NSNumber, 
     ] 
... 
recorder = try AVAudioRecorder(URL: someURL, settings: settings) 
recorder.delegate = self 
recorder.record() 

但是這不是我要找的(或?)。有沒有一種優雅的方式來實現上述的android read功能?我需要從麥克風緩衝區獲取樣本數組。或者我需要在記錄的CAF文件上進行閱讀?

非常感謝!請幫助我簡單的解釋或代碼示例。 iOS的術語不是我尚未;-)

+1

我貼一個短要點上閱讀在Swift 2中使用RemoteIO Audio Unit進行音頻採樣:https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107 – hotpaw2

回答

2

如果你不介意的浮點樣品和48kHz的,你可以快速地從麥克風獲取的音頻數據,像這樣:

let engine = AVAudioEngine() // instance variable 

func setup() {   
    let input = engine.inputNode! 
    let bus = 0 

    input.installTapOnBus(bus, bufferSize: 512, format: input.inputFormatForBus(bus)) { (buffer, time) -> Void in 
     let samples = buffer.floatChannelData[0] 
     // audio callback, samples in samples[0]...samples[buffer.frameLength-1] 
    } 

    try! engine.start() 
} 
+0

非常感謝您的幫助。我見過buffer.int16ChannelData由API提供,但是當我調用它時,我得到EXC_BAD_ACCESS錯誤。我認爲這是零。有沒有辦法配置inputNode來提供這些信息? – Robin

+1

它是零,因爲輸入總線只發送浮動數據。如果你想要一種不同的格式,我想你可以通過附加一個具有所需格式的AVAudioOutputNode來完成,並在其上安裝tap。 –

+0

我是否需要將'AVAudioInputNode'與'AVAudioOutputNode'連接來轉換輸入的'float'數據?我如何在「AVAudioInputNode」上安裝Tap?對不起,我不習慣TapOnBus方法和Apple API。 – Robin