合并AVAudioPCMBuffers

问题描述 投票:0回答:1

我正在使用installTap(onBus:bufferSize:format)的AVEngine录制音频。这将生成我累积的AVAudioPCMBuffers。录制完成后,我想将它们连接到一个AVAudioPCMBuffer中,以便可以将其与对缓冲区进行操作的其他代码一起使用。 (尽管在某些情况下,我希望将此文件写入文件,但通常我不希望这样做。)

有没有一种方法可以将缓冲区组合在一起而不会一直下​​降到核心音频层并处理AudioBufferList?

ios swift avfoundation core-audio
1个回答
0
投票

这样的作品会吗? (未经测试并为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) }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.