我一直试图在核心音频中使用新的AVAudioSinkNode。它将类型为audioBufferList的UnsafePointer<AudioBufferList>传递给处理音频的闭包。
Swift中AudioBufferList的实现是这样的,如果存在多个缓冲区,则不能访问多个缓冲区。苹果为可变版本UnsafeMutablePointer<AudioBufferList>提供了一个包装器,它被称为UnsafeMutableAudioBufferListPointer,允许访问多个缓冲区。
但是我找不到一个与不可变的UnsafePointer<AudioBufferList>相关的包装器.
let sinkNode = AVAudioSinkNode() { (timestamp, frames, audioBufferList) -> OSStatus in
// audioBufferList is UnsafePointer<AudioBufferList>
// how to access multiple buffers in audioBufferList?
}提前感谢!
发布于 2020-03-23 11:50:21
要在Swift中访问AudioBuffer中的每个AudioBufferList,您可以选择两种方式:
AudioBuffer.
UnsafeMutableAudioBufferListPointer的每个地址。如果您能够在Swift中引入UnsafeMutableAudioBufferListPointer之前找到正确的示例代码,那么第一种方法可能是您的选择,但就目前而言,很难找到一个示例代码。
要强制使用UnsafeMutableAudioBufferListPointer,您可能需要将UnsafePointer<AudioBufferList>转换为UnsafeMutablePointer<AudioBufferList>,这并不太困难:
let audioBufferListPtr = UnsafeMutableAudioBufferListPointer(UnsafeMutablePointer(mutating: audioBufferList))我相信,一旦获得UnsafeMutableAudioBufferListPointer,您就知道如何访问缓冲区。
警告:即使从UnsafePointer<AudioBufferList>到UnsafeMutablePointer<AudioBufferList>的类型转换很容易,通过audioBufferList传递的实际区域也是不可更改的。你可能需要特别小心才能不变异这样的区域。
https://stackoverflow.com/questions/60801491
复制相似问题