2017-03-10 3 views
3

Ich versuche, einige Berechnungen an den rohen PCM-Samples von MP3-Dateien durchzuführen, die ich mit einem AVAudioEngine-Diagramm spiele. Ich habe eine Schließung alle 44100 Proben, die eine AVAudioPCMBuffer bietet. Es hat eine Eigenschaft channelData des Typs UnsafePointer<UnsafeMutablePointer<Float>>?. Ich habe nicht mit Zeigern in Swift 3 gearbeitet und daher ist mir unklar, wie man auf diese Float-Werte zugreifen kann.Zugriff auf Float-Samples von AVAudioPCMBuffer zur Verarbeitung

Ich habe den folgenden Code, aber es gibt viele Fragen:

audioPlayerNode.installTap(onBus: 0, 
          bufferSize: 1024, 
          format: audioPlayerNode.outputFormat(forBus: 0)) { (pcmBuffer, time) in 

let numChans = Int(pcmBuffer.format.channelCount) 
let frameLength = pcmBuffer.frameLength 

if let chans = pcmBuffer.floatChannelData?.pointee { 
    for a in 0..<numChans { 
     let samples = chans[a]// samples is type Float. should be pointer to Floats. 
     for b in 0..<flength { 
      print("sample: \(b)") // should be samples[b] but that gives error as "samples" is Float 
     } 
    } 
} 

Zum Beispiel: Wie kann ich durch die UnsafeMutablePointer<Float s durchlaufen, die N Schwimmer Zeiger sind, wo N die Anzahl der Kanäle in dem Puffer ist. Ich konnte keine Diskussion über den Zugriff auf Pufferproben in den Apple-Dokumenten zu dieser Klasse finden.

Ich denke, das Hauptproblem ist let samples = chans[a]. Xcode sagt chans ist vom Typ UnsafeMutablePointer<Float>. Aber das sollten NumChannels Wert dieser Zeiger sein. Deshalb verwende ich a in 0..<numChans, um es zu subskribieren. Aber ich bekomme nur Float, wenn ich es tue.

EDIT:

hm, scheint mit chans.advanced(by: a) statt Indizierung festen Dinge

Antwort

2

Hier ist, was ich gefunden habe:

let arraySize = Int(buffer.frameLength) 
let samples = Array(UnsafeBufferPointer(start: buffer.floatChannelData![0], count:arraySize)) 

Dies wird unter der Annahme, Puffer der Name Ihres AVAudioPCMBuffer ist.

Auf diese Weise können Sie Zeiger vermeiden, die wahrscheinlich viel einfacher ist. Jetzt können Sie die Daten tatsächlich mit einer for-Schleife durchsuchen.

Verwandte Themen