如何在AVAudioEngine中使用AVAudioNodeTapBlock进行tap操作。

4

我正在尝试在AVAudioEngine上安装一个tap。我有以下目前的代码:

    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个回答

2

如果你想用Swift编写,最好查看参考文献的Swift版本

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接