Ale*_*ach 5 audio avfoundation swift avaudioengine avaudiopcmbuffer
我正在尝试对我正在使用 AVAudioEngine 图表播放的 mp3 文件的原始 PCM 样本进行一些计算。我每 44100 个样本就有一个闭包,提供AVAudioPCMBuffer. 它有一个channelDatatype属性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
}
}
}
Run Code Online (Sandbox Code Playgroud)
例如,如何迭代浮点指针UnsafeMutablePointer<Floats,N其中N是缓冲区中的通道数。我在此类的 Apple 文档中找不到有关访问缓冲区样本的讨论。
我认为主要问题是let samples = chans[a]。Xcode 说chans是类型UnsafeMutablePointer<Float>。但这应该相当于这些指针的 NumChannels 值。这就是为什么我用a in 0..<numChans下标来表示它。但我只是得到Float。
嗯,似乎使用chans.advanced(by: a)而不是下标固定的东西
这是我发现的:
let arraySize = Int(buffer.frameLength)
let samples = Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize))
Run Code Online (Sandbox Code Playgroud)
假设 buffer 是您的 AVAudioPCMBuffer 的名称。
这样你就可以避免指针,这可能要简单得多。现在您实际上可以使用 for 循环搜索数据。