2017-05-29 49 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

相关问题