Tap Mic Input mit AVAudioEngine in Swift
Ich bin sehr gespannt auf die neue AVAudioEngine. Es scheint ein guter API-Wrapper für Audio-Geräte zu sein. Leider ist die Dokumentation bisher nicht vorhanden, und ich habe Probleme, ein einfaches Diagramm zum Laufen zu bringen.
Mit dem folgenden einfachen Code zum Einrichten eines Audio-Engine-Diagramms wird der Tap-Block niemals aufgerufen. Es ahmt einen Teil des im Web schwebenden Beispielcodes nach, auch wenn dieser nicht funktioniert hat.
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)")
}
}
Alles, was ich suche, ist der rohe PCM-Puffer für die Analyse. Ich brauche keine Effekte oder Ausgaben. Laut dem WWDC-Vortrag "502 Audio Engine in Practice" sollte dieses Setup funktionieren.
Wenn Sie nun Daten vom Eingabeknoten erfassen möchten, können Sie einen Knotentipp installieren, worüber wir bereits gesprochen haben.
Aber das Interessante an diesem Beispiel ist, dass ich, wenn ich nur mit dem Eingangsknoten arbeiten wollte, beispielsweise nur Daten vom Mikrofon erfassen und möglicherweise untersuchen, in Echtzeit analysieren oder in eine Datei schreiben möchte, diese direkt installieren kann Tippen Sie auf den Eingabeknoten.
Und das Tippen erledigt die Arbeit, den Eingabeknoten für Daten zu ziehen, ihn in Puffern abzulegen und ihn dann an die Anwendung zurückzugeben.
obald Sie diese Daten haben, können Sie alles tun, was Sie dazu benötigen.
Hier sind einige Links, die ich ausprobiert habe:
http: //hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.htmhttp: //jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playground (SIGABRT auf dem Spielplatz bei startAndReturnError)Edit: Dies ist die Implementierung, die auf dem Vorschlag von Thorsten Karrer basiert. Es funktioniert leider nicht.
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")
}
}