我正在使用installTap(onBus:bufferSize:format)
的AVEngine录制音频。这将生成我累积的AVAudioPCMBuffers。录制完成后,我想将它们连接到一个AVAudioPCMBuffer中,以便可以将其与对缓冲区进行操作的其他代码一起使用。 (尽管在某些情况下,我希望将此文件写入文件,但通常我不希望这样做。)
有没有一种方法可以将缓冲区组合在一起而不会一直下降到核心音频层并处理AudioBufferList?
这样的作品会吗? (未经测试并为Float
数据进行硬编码,但可能是一个开始)
extension AVAudioPCMBuffer {
func append(_ buffer: AVAudioPCMBuffer) {
append(buffer, startingFrame: 0, frameCount: buffer.frameLength)
}
func append(_ buffer: AVAudioPCMBuffer, startingFrame: AVAudioFramePosition, frameCount: AVAudioFrameCount) {
precondition(format == buffer.format, "Format mismatch")
precondition(startingFrame + AVAudioFramePosition(frameCount) <= AVAudioFramePosition(buffer.frameLength), "Insufficient audio in buffer")
precondition(frameLength + frameCount <= frameCapacity, "Insufficient space in buffer")
let dst = floatChannelData!
let src = buffer.floatChannelData!
memcpy(dst.pointee.advanced(by: stride * Int(frameLength)),
src.pointee.advanced(by: stride * Int(startingFrame)),
Int(frameCount) * stride * MemoryLayout<Float>.size)
frameLength += frameCount
}
convenience init?(concatenating buffers: AVAudioPCMBuffer...) {
precondition(buffers.count > 0)
let totalFrames = buffers.reduce(0, { $1.frameLength })
self.init(pcmFormat: buffers[0].format, frameCapacity: totalFrames)
buffers.forEach { append($0) }
}
}