2017-05-29 50 views
1

什麼樣會緩衝含有當我用installTap(onBus使用多聲道音頻?什麼樣會緩衝含有當我用installTap(onBus使用多聲道音頻?

如果通道計數> 1個,那麼它將包含左麥克風?或它將包含的樣本由左麥克風和右麥克風?

當我用iphone模擬器然後進行格式化= pcmFormatFloat32,信道計數= 2,採樣率= 44100.0,不是隔行

我使用此代碼

let bus = 0 
inputNode.installTap(onBus: bus, bufferSize: myTapOnBusBufferSize, format: theAudioFormat) { 
      (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in 
      self.onNewBuffer(buffer) 
     } 

func onNewBuffer(_ inputBuffer:AVAudioPCMBuffer!) 
{ 
    var samplesAsDoubles:[Double] = [] 

    for i in 0 ..< Int(inputBuffer.frameLength) 
    { 
     let theSample = Double((inputBuffer.floatChannelData?.pointee[i])!) 
     samplesAsDoubles.append(theSample) 
    } 
} 

print("number of input busses = \(inputNode.numberOfInputs)") 

其打印 號碼輸入總線= 1

用於從緩衝器在我samplesAsDoubles陣列中的每個樣品,我有從它會是怎樣的信道塊的內?在什麼時候記錄這個樣本?

+0

關於閱讀多通道緩衝看到講座WWDC 2014 在覈心音頻輸入=> 55分鐘 – userForStackExchange

回答

1

從floatChannelData的頭部註釋:

返回的指針是到format.channelCount指針浮動。這些指針 中的每一個都是「frameLength」有效樣本,它們被「步幅」樣本隔開。

如果format.interleaved爲false(與標準解交織浮點格式一樣),那麼指針將分隔大塊的內存。 「stride」爲1.

FloatChannelData爲您提供了2D浮點數組。對於非交錯式雙通道緩存,你就可以訪問單個樣本是這樣的:

let channelCount = Int(buffer.format.channelCount) 
let frameCount = Int(buffer.frameLength) 

if let channels = buffer.floatChannelData { //channels is 2D float array 
    for channelIndex in 0..<channelCount { 
     let channel = channels[channelIndex] //1D float array 
     print(channelIndex == 0 ? "left" : "right") 
     for frameIndex in 0..<frameCount { 
      let sample = channel[frameIndex] 
      print(" \(sample)") 
     } 
    } 
} 
+0

戴夫嗨 謝謝回答什麼是新。 真的很有幫助。 現在我明白我需要什麼了。但是什麼是內存的跨步,什麼是二維浮點數組我不明白 – userForStackExchange

+0

你應該搜索stackoverflow來找到這些其他問題的答案。如果你在那裏找不到答案,寫下新的問題:) – dave234

相關問題