AudioKit,通过淡入/淡出将AVAudioPCMBuffer数组导出到音频文件

时间:2018-10-07 23:28:01

标签: swift audiokit

我正在从AKLazyTap捕获音频,并在应用程序的音频运行时在后台将累积的copy(from:readOffset:frames)渲染为音频文件。这很好用,但是我想添加淡入/淡出效果。我看到了为单个AVAudioPCMBuffer添加淡入的便捷扩展,但是我不确定如何在数组上进行淡入淡出。我曾想连接缓冲区,但似乎对此没有支持。有人知道当前是否可行?基本上,它需要与func renderBufferedAudioToFile(_ audioBuffers: [AVAudioPCMBuffer], withStartOffset startOffset: Int, endOffset: Int, fadeIn: Float64, fadeOut: Float64, atURL url: URL) { // strip off the file name let name = String(url.lastPathComponent.split(separator: ".")[0]) var url = self.module.stateManager.audioCacheDirectory // UNCOMPRESSED url = url.appendingPathComponent("\(name).caf") let format = Conductor.sharedInstance.sourceMixer.avAudioNode.outputFormat(forBus: 0) var settings = format.settings settings["AVLinearPCMIsNonInterleaved"] = false // temp buffer for fades let totalFrameCapacity = audioBuffers.reduce(0) { $0 + $1.frameLength } guard let tempAudioBufferForFades = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: totalFrameCapacity) else { print("Failed to create fade buffer!") return } // write ring buffer to file. let file = try! AVAudioFile(forWriting: url, settings: settings) var writeOffset: AVAudioFrameCount = 0 for i in 0 ..< audioBuffers.count { var buffer = audioBuffers[i] let channelCount = Int(buffer.format.channelCount) if i == 0 && startOffset != 0 { // copy a subset of samples in the buffer if let subset = buffer.copyFrom(startSample: AVAudioFrameCount(startOffset)) { buffer = subset } } else if i == audioBuffers.count - 1 && endOffset != 0 { if let subset = buffer.copyTo(count: AVAudioFrameCount(endOffset)) { buffer = subset } } // write samples into single, long buffer for i in 0 ..< buffer.frameLength { for n in 0 ..< channelCount { tempAudioBufferForFades.floatChannelData?[n][Int(i + writeOffset)] = (buffer.floatChannelData?[n][Int(i)])! } } print("buffer \(i), writeOffset = \(writeOffset)") writeOffset = writeOffset + buffer.frameLength } // update! tempAudioBufferForFades.frameLength = totalFrameCapacity if let bufferWithFades = tempAudioBufferForFades.fade(inTime: fadeIn, outTime: fadeOut) { try! file.write(from: bufferWithFades) } } 类似的东西,但也需要具有写偏移量...

或者也许有一种更简单的方法?

  • 更新

好的,在研究了一些相关的AK代码之后,我尝试将缓冲区数据直接复制到单个长缓冲区中,然后应用渐变便利功能。但是,这给了我一个空文件(4k)。在这里我没有看到一些明显的错误吗?

{{1}}

0 个答案:

没有答案