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