当我使用installTap时,缓冲区包含哪些样本(onBus用于多声道音频?

时间:2017-05-29 04:41:56

标签: ios audio avfoundation core-audio avaudioengine

当我使用installTap时,缓冲区会包含哪些样本(onBus用于多声道音频?

如果频道数> 1然后它将包含左麦克风?或者它将包含左麦克风和右麦克风的样本?

当我使用iphone模拟器时,然后Format = pcmFormatFloat32,channelCount = 2,sampleRate = 44100.0,而不是Interleaved

我使用此代码

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

对于我的samples中的每个样本来自缓冲区的数据,我从哪个通道进入块内?该样本记录的时间是什么时候?

1 个答案:

答案 0 :(得分:1)

来自floatChannelData的标题注释:

  

返回的指针是指向float的format.channelCount指针。这些指针中的每一个               是“frameLength”有效样本,由“步幅”样本间隔。

     

如果format.interleaved为false(与标准的deinterleaved float格式一样),那么               指针将分开内存块。 “步幅”是1。

FloatChannelData为您提供2D浮点数组。对于非交错2通道缓冲区,您可以访问以下各个样本:

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)")
        }
    }
}