Sono davvero entusiasta del nuovo AVAudioEngine. Sembra un buon wrapper API intorno all'unità audio. Sfortunatamente la documentazione è finora inesistente e ho problemi a far funzionare un semplice grafico.Toccare Ingresso microfono utilizzando AVAudioEngine in Swift
Utilizzando il seguente codice semplice per impostare un grafico del motore audio, il blocco di tocco non viene mai chiamato. Imita alcuni dei codici di esempio che circolano sul web, sebbene anche quelli non funzionino.
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)")
}
}
Tutto quello che sto cercando è il buffer PCM prima per l'analisi. Non ho bisogno di effetti o output. Secondo il discorso del WWDC "502 Audio Engine in Practice", questa configurazione dovrebbe funzionare.
Ora se si desidera acquisire dati dal nodo di input, è possibile installare un nodo toccare e ne abbiamo parlato.
Ma ciò che è interessante di questo particolare esempio è, se volessi lavorare solo con il nodo di input, diciamo semplicemente catturare dati dal microfono e magari esaminarlo, analizzarlo in tempo reale o magari scriverlo in un file, io puoi installare direttamente un tocco sul nodo di input.
E il rubinetto eseguirà il lavoro di estrazione del nodo di input per i dati, inserendolo nei buffer e quindi restituendolo all'applicazione.
Una volta ottenuti questi dati, puoi fare tutto ciò che devi fare.
ecco alcuni link che ho provato:
- http://hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.html
- http://jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playgrounds (SIGABRT nel parco giochi sulla startAndReturnError)
Edit: Questa è l'implementazione basata su suggerimento di Thorsten Karrer. Purtroppo non funziona.
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")
}
}
ho tentato questo e modificato la mia domanda con il codice utilizzato. Il codice nella tua risposta funziona per te? – brodney
Jup, lavora per me. Non l'ho provato nel parco giochi ma funziona quando ho compilato una corsa da Xcode. Il blocco tap è chiamato continuamente. –
Purtroppo devo ammettere che dopotutto era un oggetto non trattenuto. La mia classe AudioProcessor veniva istanziata in un metodo, non come una proprietà di classe. – brodney