Audiokit AKFFTTap генерирует массив 0 в режиме автономного рендеринга - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь использовать Audiokit и его AKFFTap для получения данных fft аудиофайла.

Мне удается получить их при обработке в реальном времени, но, как и при работе в автономном режиме рендеринга, сгенерированные данные равны 0.

Так что мне было интересно, возможно ли получить их при автономный режим рендеринга?

Вот код, который я использую:

class OfflineProcessingClass {

  var tracker: AKFrequencyTracker!
  var fftTap: AKFFTTap!

  // ....

  private func process(audioFile: AKAudioFile) throws {
    // Make connection
    let player = try AKAudioPlayer(file: audioFile)
    tracker = AKFrequencyTracker(player)
    fftTap = AKFFTTap(tracker)
    AudioKit.output = tracker

    // Setup offline rendering mode
    let timeIntervalInSeconds: TimeInterval = 0.1
    let sampleInterval = Int(floor(timeIntervalInSeconds * audioFile.sampleRate))

     try AudioKit.engine.enableManualRenderingMode(
      .offline,
      format: audioFile.fileFormat,
      maximumFrameCount: AVAudioFrameCount(sampleInterval)
    )

    // Setup buffer
    let buffer = AVAudioPCMBuffer(
      pcmFormat: AudioKit.engine.manualRenderingFormat,
      frameCapacity: AudioKit.engine.manualRenderingMaximumFrameCount
    )

    // Start processing
    try AudioKit.start()
    player.start()

    // Read file offline
    while AudioKit.engine.manualRenderingSampleTime < audioFile.length {
      let frameCount = audioFile.length - manualRenderingSampleTime
      let framesToRender = min(AVAudioFrameCount(frameCount), buffer.frameCapacity)

      try! AudioKit.engine.renderOffline(framesToRender, to: buffer)

      // track is good
      print("\(tracker.amplitude) dB - \(tracker!.frequency) Hz")

      // Array of 0
      print(fftTap.fftData) /////////////// <====== Error is here
    }

    // End processing
    player.stop()
    AudioKit.engine.stop()
  }

}

Вы видите что-то не так в этом коде?

...