我正在尝试对我正在玩AVAudioEngine图的mp3文件的原始PCM样本进行一些计算。我每44100个样本有一个闭包,提供AVAudioPCMBuffer
。它具有channelData
类型的属性UnsafePointer<UnsafeMutablePointer<Float>>?
。我没有使用Swift 3中的指针,因此我不清楚如何访问这些Float值。
我有以下代码,但有很多问题:
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
的{{1}}浮点指针,其中N
是缓冲区中的通道数。我无法在此类的Apple Docs中找到有关访问缓冲区样本的讨论。
我认为主要问题是N
。 Xcode称let samples = chans[a]
的类型为chans
。但这应该是NumChannels值得的那些指针。这就是我使用UnsafeMutablePointer<Float>
下标的原因。但是,当我这样做时,我只会a in 0..<numChans
。
嗯,似乎使用Float
而不是下标固定的东西
答案 0 :(得分:3)
以下是我发现的内容:
let arraySize = Int(buffer.frameLength)
let samples = Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize))
这是假设缓冲区是AVAudioPCMBuffer的名称。
这样你可以避免指针,这可能更简单。现在,您可以使用for循环实际搜索数据。