Нажмите «Ввод микрофона» с помощью 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")
}
}