访问AVAudioPCMBuffer的Float样本进行处理

时间:2017-03-10 16:09:58

标签: swift audio avfoundation avaudioengine avaudiopcmbuffer

我正在尝试对我正在玩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而不是下标固定的东西

1 个答案:

答案 0 :(得分:3)

以下是我发现的内容:

let arraySize = Int(buffer.frameLength)
let samples = Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize))

这是假设缓冲区是AVAudioPCMBuffer的名称。

这样你可以避免指针,这可能更简单。现在,您可以使用for循环实际搜索数据。