我想获取AKAmplitudeTracker的音量,但要获取-inf我有什么毛病请帮忙。

    AKAudioFile.cleanTempDirectory()
    AKSettings.audioInputEnabled = true
    AKSettings.bufferLength = .medium
    AKSettings.defaultToSpeaker = true
    AKSettings.playbackWhileMuted = true
    AKSettings.enableRouteChangeHandling = true
    AKSettings.enableCategoryChangeHandling = true
     AKSettings.enableLogging = true
    do {
        try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP)
    } catch {
        print("error \(error.localizedDescription)")
    }

    microphone = AKMicrophone()!


    tracker = AKAmplitudeTracker(microphone)
    booster = AKBooster(tracker, gain: 0)
    AudioKit.output = booster
    try AudioKit.start()

=================
extension AKAmplitudeTracker {

    var volume: Decibel {
        return 20.0 * log10(amplitude)
    }
}

=================

输出打印(跟踪器振幅)
0.0

最佳答案

快速浏览一下,似乎您遵循了基本设置,但是您似乎无法正确地跟踪及时生成的数据!在一段时间内会提供振幅数据,用于从麦克风进行的计算,因此可以使用计时器来查看其在时间轴上的外观,如下所示:

func reset() throws {
    do {
        self.timer.invalidate()
        self.timer = nil
    } catch {
        throw error
    }
}

func microphoneTracker() {
    guard self.timer == nil else { return }
    self.watcher()
    let timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in

         log.info(self.akMicrophoneAmplitudeTracker.amplitude)
    }

    self.timer = timer
}

withTimeInterval更改为想要检查振幅的频率。

我认为我为您准备的内容可读性很强,但我将用几句话来分解一下:
  • 在属性中保留AKAmplitudeTracker的引用,在这里我将其命名为akMicrophoneAmplitudeTracker
  • 保留您的定时事件的引用,它将在一段时间
  • 期间检查振幅值
  • 计算闭包主体中的数据,属性值为.amplitude
  • 该示例中的计算是一个logger,它显示.amplitude
  • 根据需要,使用.invalidate方法停止timer

  • 您可能需要仔细检查代码的其他几件事是,确保跟踪器是信号链的一部分,因为这是AVAudioEngine引擎的要求。我还注意到在其他人的代码中,对.start中的AKAmplitudeTracker方法的调用如下:
    akMicrophoneAmplitudeTracker.start()
    

    最后,请记住,如果要通过Simulator测试它,请查看主机的麦克风设置,并期望其振幅可能与实际硬件不同。

    10-08 18:36