AudioKit: пытается записать звук с микрофона в файл, но ничего не записывается - PullRequest
0 голосов
/ 16 ноября 2018

У меня проблема с записью звука с микрофона моего тестового устройства в файл .caf в Swift, XCode 9.4.1, с использованием последней версии AudioKit.В простом тесте, когда я посылаю звук прямо с микрофона на выход через AKBooster, он работает просто отлично, и я слышу микрофонный вход, исходящий из динамиков.Я более или менее следую этому примеру , хотя снова использую усилительный узел вместо осциллятора.

Вот мой код:

class MicrophoneHandler
{
    var microphone : AKMicrophone!
    var booster : AKBooster!
    var mixer : AKMixer!
    var recorder : AKNodeRecorder!
    var file : AKAudioFile!
    var player : AKAudioPlayer!

    init()
    {   
        setupMicrophone()

        microphone = AKMicrophone()
        booster = AKBooster(microphone)                  // Stereo amplifier for microphone
        mixer = AKMixer(booster)
        file = try! AKAudioFile()                        // File to store recorder output

        player = try? AKAudioPlayer(file: file)          // Player to play back recorded audio file
        //player.looping = true

        recorder = try? AKNodeRecorder(node: mixer, file: file)

        try? recorder.record()
        sleep(5)
        let dur = String(format: "%0.3f seconds", recorder.recordedDuration)
        print("Stopped. (\(dur) recorded)")
        recorder.stop()

        //file.exportAsynchronously(name: "Test", baseDir: .documents, exportFormat: .caf){ [weak self] _, _ in
        //}

        //player.play()
        //AudioKit.output = player!

        //try? AudioKit.start()
    }

    func setupMicrophone()
    {
        // Function to initialise microphone settings
        // Adapted from AudioKit example code found here:
        // https://audiokit.io/examples/MicrophoneAnalysis

        AKSettings.bufferLength = .medium
        AKSettings.ioBufferDuration = 0.002 // TODO experiment with this to control latency

        do
        {
            try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP) // Set session type & allow streaming to Bluetooth devices
        } catch
        {
            AKLog("Could not set session category.")
        }

        AKSettings.defaultToSpeaker = true // Output to speaker when audio input is enabled
    }
}

У меня естьзакомментировал код экспорта, так как проблема, похоже, не здесь.На консоли отображается следующее:

AKMicrophone.swift:init():45:Mixer inputs 8
AKAudioPlayer.swift:updatePCMBuffer():533:AKAudioPlayer Warning:  "BF848EC0-94F8-4E39-A211-784B001CED72.caf" is an empty file
2018-11-16 17:49:16.936169+0000 VoxBox[2258:6984570] Audio files cannot be non-interleaved. Ignoring setting AVLinearPCMIsNonInterleaved YES.
AKNodeRecorder.swift:record():104:AKNodeRecorder: recording
Stopped. (0.000 seconds recorded)

Как видите, по какой-то причине рекордер не записывает в файл.На мой взгляд, мой код должен

  1. Инициализировать микрофон (включая настройки)
  2. Направить вход микрофона через усилитель, а затем микшер (микширование с банком FX произойдет позже)
  3. Создание пустого аудиофайла .caf для записи в
  4. Настройка проигрывателя для воспроизведения этого файла, когда придет время
  5. Настройка рекордера для записи выходных данныхузел микшера для аудиофайла
  6. Запишите 5 секунд ввода микрофона в аудиофайл

И все же по какой-то причине ничего не записывается.Очевидно, я что-то упустил или неправильно понял, как AKNodeRecorder работает в этом отношении.Я прочитал столько вопросов StackOverflow по схожим темам, сколько мог, пролистал документацию по AudioKit и прочитал пару примеров с сайта AudioKit, но, похоже, ничто не решает мою конкретную проблему.

Любая помощь может помочьочень цениться.

...