我正在尝试在AVAudioEngine上安装一个水龙头。我有当前的代码:
guard let engine = engine, let input = engine.inputNode else {
print("error!")
return
}
let format = input.inputFormat(forBus: 0)
let bufferSize = 4096
input.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize), format: format, block: )
我不确定该块中的内容。关于此,没有太多文档。我发现了这个:https://developer.apple.com/reference/avfoundation/avaudionodetapblock?language=objc
有人可以解释如何使用它吗?
谢谢,
Feras A.
答案 0 :(得分:0)
如果你想用Swift写它,你最好检查一下Swift version of the reference。
声明
typealias AVAudioNodeTapBlock = (AVAudioPCMBuffer, AVAudioTime) -> Void
你需要传递一个带有两个参数并且什么都不返回的闭包,所以你可以把它写成:
input.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize), format: format, block: {buffer, when in
//...
})
两个参数buffer
和when
的类型分别为AVAudioPCMBuffer
和AVAudioTime
。
因此,如果您想将录制的音频录制到音频文件中,您可以编写如下内容:
input.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize), format: format, block: {buffer, when in
do {
try self.audioFile?.write(from: buffer)
} catch {
print(error)
}
})
(假设audioFile
是类型为AVAudioFile?
的实例属性。)
无论如何,您需要知道如何使用AVAudioPCMBuffer
。
我不确定input.inputFormat(forBus: 0)
是否适合您的格式,但这可能是另一个问题。