访问avaudiopcmbuffer的浮动样品进行处理



我正在尝试在我使用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循环搜索数据。

最新更新