Toque na entrada do microfone usando o AVAudioEngine no Swift
Estou realmente empolgado com o novo AVAudioEngine. Parece um bom wrapper de API em torno da unidade de áudio. Infelizmente, a documentação é inexistente até agora, e estou tendo problemas para conseguir um gráfico simples para funcionar.
Usando o seguinte código simples para configurar um gráfico de mecanismo de áudio, o bloco de derivação nunca é chamado. Ele imita parte do código de amostra flutuando na Web, embora eles também não funcionem.
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)")
}
}
Tudo o que estou procurando é o buffer pcm bruto para análise. Não preciso de nenhum efeito ou saída. De acordo com a palestra da WWDC "502 Audio Engine in Practice", essa configuração deve funcionar.
Agora, se você deseja capturar dados do nó de entrada, pode instalar um toque no nó e falamos sobre isso.
Mas o que é interessante nesse exemplo em particular é que, se eu quiser trabalhar apenas com o nó de entrada, digitar apenas capturar dados do microfone e talvez examiná-los, analisá-los em tempo real ou talvez gravá-los em arquivo, posso instalar diretamente um toque no nó de entrada.
E a torneira fará o trabalho de puxar o nó de entrada para dados, colocando-o em buffers e retornando-o de volta ao aplicativo.
Depois de ter esses dados, você pode fazer o que for necessário.
Aqui estão alguns links que eu tentei:
http://hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.htmlhttp://jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playgrounds (SIGABRT no playground em startAndReturnError)Edit: Esta é a implementação baseada na sugestão de Thorsten Karrer. Infelizmente, isso não funciona.
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")
}
}