如何在 AVAudioEngine 的点击中使用 AVAudioNodeTapBlock。
How to use AVAudioNodeTapBlock in a tap in AVAudioEngine.
我正在尝试在 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.
如果要写成Swift,最好勾选Swift version of the reference。
Declaration
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)
是否适合您的情况,但这可能是另一个问题。
我正在尝试在 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.
如果要写成Swift,最好勾选Swift version of the reference。
Declaration
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)
是否适合您的情况,但这可能是另一个问题。