当我使用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中的每个样本来自缓冲区的数据,我从哪个通道进入块内?该样本记录的时间是什么时候?
答案 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)")
}
}
}