我正在尝试在我使用AvaudioEngine图的MP3文件的原始PCM样本上进行一些计算。我每44100个提供AVAudioPCMBuffer
的样本都可以关闭。它具有UnsafePointer<UnsafeMutablePointer<Float>>?
类型的属性channelData
。我尚未与Swift 3中的指针合作,因此我不清楚如何访问这些浮点值。
我有以下代码,但是有很多问题:
audioPlayerNode.installTap(onBus: 0,
bufferSize: 1024,
format: audioPlayerNode.outputFormat(forBus: 0)) { (pcmBuffer, time) in
let numChans = Int(pcmBuffer.format.channelCount)
let frameLength = pcmBuffer.frameLength
if let chans = pcmBuffer.floatChannelData?.pointee {
for a in 0..<numChans {
let samples = chans[a]// samples is type Float. should be pointer to Floats.
for b in 0..<flength {
print("sample: (b)") // should be samples[b] but that gives error as "samples" is Float
}
}
}
例如,如何通过UnsafeMutablePointer<Float
s迭代N
浮点指针,其中N
是缓冲区中的通道数。我找不到有关此类Apple文档中访问缓冲区样本的讨论。
我认为主要问题是let samples = chans[a]
。Xcode说chans
是类型UnsafeMutablePointer<Float>
。但这应该是那些指针的数字。这就是为什么我使用a in 0..<numChans
将其订阅的原因。但是当我这样做时,我只会得到Float
。
编辑:
hm,似乎使用 chans.advanced(by: a)
而不是订阅固定的东西
这是我发现的:
let arraySize = Int(buffer.frameLength)
let samples = Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize))
这是假设缓冲区是您的avaudiopcmbuffer的名称。
这样,您可以避免指针,这可能更简单。现在,您实际上可以使用for循环搜索数据。