2016-08-26 9 views
2

Ich habe ein Projekt für Android lesen ein short[] Array mit PCM-Daten von Mikrofon-Puffer für Live-Analyse. Ich muss diese Funktionalität in iOS Swift konvertieren. In Android ist es sehr einfach und sieht wie folgt aus ..IOS Swift PCM-Puffer lesen

import android.media.AudioFormat; 
import android.media.AudioRecord; 
... 
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, someSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize(...)); 
recorder.startRecording(); 

später las ich den Puffer mit

recorder.read(data, offset, length); //data is short[] 

(Das ist, was ich suche)

Dokumentation: https://developer.android.com/reference/android/media/AudioRecord.html

Ich bin sehr neu in Swift und iOS. Ich habe eine Menge Dokumentation über AudioToolkit gelesen, ... Core und was auch immer. Alles, was ich gefunden habe, ist C++/Obj-C und Bridging Swift Header-Lösungen. Das ist viel zu fortgeschritten und für mich veraltet.

Vorerst kann ich PCM-Daten in eine CAF-Datei mit AVFoundation

settings = [ 
     AVLinearPCMBitDepthKey: 16 as NSNumber, 
     AVFormatIDKey: Int(kAudioFormatLinearPCM), 
     AVLinearPCMIsBigEndianKey: 0 as NSNumber, 
     AVLinearPCMIsFloatKey: 0 as NSNumber, 
     AVSampleRateKey: 12000.0, 
     AVNumberOfChannelsKey: 1 as NSNumber, 
     ] 
... 
recorder = try AVAudioRecorder(URL: someURL, settings: settings) 
recorder.delegate = self 
recorder.record() 

lesen Aber das ist nicht das, was ich suche (oder?). Gibt es eine elegante Möglichkeit, die oben beschriebene Android read Funktionalität zu erreichen? Ich brauche ein Sample-Array aus dem Mikrofonpuffer. Oder muss ich die aufgezeichnete CAF-Datei lesen?

Vielen Dank! Bitte helfen Sie mir mit einfachen Erklärungen oder Codebeispielen. iOS Terminologie ist meins noch nicht ;-)

+1

ich beim Lesen eines kurzen Kern geschrieben Audio Samples mit der RemoteIO Audio Unit in Swift 2 hier: https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107 – hotpaw2

Antwort

2

Wenn Sie nichts dagegen haben, Punktmuster und 48kHz schwimmen, schnell Audiodaten aus dem Mikrofon wie so bekommen kann:

let engine = AVAudioEngine() // instance variable 

func setup() {   
    let input = engine.inputNode! 
    let bus = 0 

    input.installTapOnBus(bus, bufferSize: 512, format: input.inputFormatForBus(bus)) { (buffer, time) -> Void in 
     let samples = buffer.floatChannelData[0] 
     // audio callback, samples in samples[0]...samples[buffer.frameLength-1] 
    } 

    try! engine.start() 
} 
+0

Vielen Dank für Ihre Hilfe. Ich habe gesehen, dass buffer.int16ChannelData von der API bereitgestellt wird, aber wenn ich sie anrufe, erhalte ich den Fehler EXC_BAD_ACCESS. Ich denke, das ist nichts. Gibt es eine Möglichkeit, InputNode so zu konfigurieren, dass diese Informationen bereitgestellt werden? – Robin

+1

Es ist Null, weil dieser Eingangsbus nur Float-Daten verkauft. Wenn Sie ein anderes Format wünschen, können Sie das tun, indem Sie einen 'AVAudioOutputNode' an das gewünschte Format anhängen und den Tap darauf installieren. –

+0

Muss ich 'AVAudioInputNode' mit' AVAudioOutputNode' verbinden, um incoming 'float' Daten zu konvertieren? Wie installiere ich den AVAudioInputNode? Tut mir leid, dass ich die TapOnBus-Methode und Apple API nicht gewohnt bin. – Robin