如何在 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
        //...
    })

bufferwhen两个参数的类型分别是AVAudioPCMBufferAVAudioTime

所以,如果你想把点击的音频录制成音频文件,你可以这样写:

    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) 是否适合您的情况,但这可能是另一个问题。