gpt4 book ai didi

swift - 播放 AVAudioPCMBuffer 的片段

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:25 30 4
gpt4 key购买 nike

我正在为 iOS 应用创建这个简单的录音机和编辑器界面:

Screenshot of the recorder/editor interface

音频被记录到用于创建波形的 float 组中。录制后,我将 float 数据复制到 AVAudioPCMBuffer 中,以便与 AVAudioPlayerNode 一起播放。我可以从一开始就播放缓冲区,但我不知道如何只播放一段缓冲区。 scheduleSegment 函数仅适用于文件。

最佳答案

您可以创建一个新的缓冲区,它是原始缓冲区的一部分。 AVAudioPCMBuffer 和 AudioBufferlist 在 Swift 中是一种痛苦。有几种方法可以做到这一点,如果您使用的是 float ,则可以访问 AVAUdioPCMBuffer.floatChannelData,但这里有一种方法适用于 float 和整数样本。

func segment(of buffer: AVAudioPCMBuffer, from startFrame: AVAudioFramePosition, to endFrame: AVAudioFramePosition) -> AVAudioPCMBuffer? {
let framesToCopy = AVAudioFrameCount(endFrame - startFrame)
guard let segment = AVAudioPCMBuffer(pcmFormat: buffer.format, frameCapacity: framesToCopy) else { return nil }

let sampleSize = buffer.format.streamDescription.pointee.mBytesPerFrame

let srcPtr = UnsafeMutableAudioBufferListPointer(buffer.mutableAudioBufferList)
let dstPtr = UnsafeMutableAudioBufferListPointer(segment.mutableAudioBufferList)
for (src, dst) in zip(srcPtr, dstPtr) {
memcpy(dst.mData, src.mData?.advanced(by: Int(startFrame) * Int(sampleSize)), Int(framesToCopy) * Int(sampleSize))
}

segment.frameLength = framesToCopy
return segment
}

关于swift - 播放 AVAudioPCMBuffer 的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162241/

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