如何在AVAudioEngine的点击中使用AVAudioNodeTapBlock。

时间:2017-01-23 11:01:43

标签: swift 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.

1 个答案:

答案 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
        //...
    })

两个参数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)是否适合您的格式,但这可能是另一个问题。