У меня проблема с записью звука с микрофона моего тестового устройства в файл .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)
Как видите, по какой-то причине рекордер не записывает в файл.На мой взгляд, мой код должен
- Инициализировать микрофон (включая настройки)
- Направить вход микрофона через усилитель, а затем микшер (микширование с банком FX произойдет позже)
- Создание пустого аудиофайла .caf для записи в
- Настройка проигрывателя для воспроизведения этого файла, когда придет время
- Настройка рекордера для записи выходных данныхузел микшера для аудиофайла
- Запишите 5 секунд ввода микрофона в аудиофайл
И все же по какой-то причине ничего не записывается.Очевидно, я что-то упустил или неправильно понял, как AKNodeRecorder работает в этом отношении.Я прочитал столько вопросов StackOverflow по схожим темам, сколько мог, пролистал документацию по AudioKit и прочитал пару примеров с сайта AudioKit, но, похоже, ничто не решает мою конкретную проблему.
Любая помощь может помочьочень цениться.