gpt4 book ai didi

ios - 组合 AVAudioPCMBuffer

转载 作者:行者123 更新时间:2023-11-30 10:27:21 26 4
gpt4 key购买 nike

我正在使用 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) }
}
}

关于ios - 组合 AVAudioPCMBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com