Нажмите «Ввод микрофона» с помощью AVAudioEngine в Swift

Я действительно взволнован новым AVAudioEngine. Это похоже на хорошую обертку API вокруг аудиоустройства. К сожалению, документации пока не существует, и у меня возникают проблемы с работой простого графика.

Используя следующий простой код для настройки графика звукового движка, блок tap никогда не вызывается. Он имитирует некоторые примеры кода, плавающего в сети, хотя они также не работают.

let inputNode = audioEngine.inputNode
var error: NSError?
let bus = 0

inputNode.installTapOnBus(bus, bufferSize: 2048, format: inputNode.inputFormatForBus(bus)) { 
    (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
    println("sfdljk")
}

audioEngine.prepare()
if audioEngine.startAndReturnError(&error) {
    println("started audio")
} else {
    if let engineStartError = error {
        println("error starting audio: \(engineStartError.localizedDescription)")
    }
}

Все, что я ищу, это необработанный буфер PCM для анализа. Мне не нужны какие-либо эффекты или выход. Согласно докладу WWDC "502 Audio Engine на практике", эта настройка должна работать.

Теперь, если вы хотите захватить данные с входного узла, вы можете установить узел, нажав, и мы говорили об этом.

Но что интересно в этом конкретном примере, если я хотел работать только с входным узлом, скажем, просто захватить данные с микрофона и, возможно, изучить их, проанализировать их в режиме реального времени или записать в файл, я могу установить нажмите на входной узел.

И тап выполнит работу по извлечению входного узла для данных, вставке их в буферы и затем возвращает их обратно в приложение.

Получив эти данные, вы можете делать с ними все, что вам нужно.

Вот несколько ссылок, которые я пробовал:

http://hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.htmlhttp://jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playgrounds (SIGABRT на детской площадке на startAndReturnError)

Изменить: Это реализация, основанная на предложении Торстен Каррер. Это к сожалению не работает.

class AudioProcessor {
    let audioEngine = AVAudioEngine()

    init(){
        let inputNode = audioEngine.inputNode
        let bus = 0
        var error: NSError?

        inputNode.installTapOnBus(bus, bufferSize: 2048, format:inputNode.inputFormatForBus(bus)) {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
                println("sfdljk")
        }

        audioEngine.prepare()
        audioEngine.startAndReturnError(nil)
        println("started audio")
    }
}

Ответы на вопрос(4)

Ваш ответ на вопрос