2017-03-10 9 views
3

私はAVAudioEngineグラフで再生しているmp3ファイルの生のPCMサンプルを計算しようとしています。私はAVAudioPCMBufferを提供する44100サンプルごとに閉鎖しています。それはタイプUnsafePointer<UnsafeMutablePointer<Float>>?channelDataのプロパティを持っています。私はSwift 3のポインタで作業していないので、これらのFloat値にアクセスする方法は不明です。処理のためにAVAudioPCMBufferのフロートサンプルにアクセスする

私は、次のコードを持っていますが、多くの問題があります。たとえば

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 
     } 
    } 
} 

、私はNは、バッファ内のチャネルの数であるNフロートポインタですUnsafeMutablePointer<Float Sを反復処理はどうすればよいが。このクラスのApple Docsでバッファサンプルにアクセスすることに関する議論が見つかりませんでした。

私は主な問題はlet samples = chans[a]だと思います。 XcodeによるとchansUnsafeMutablePointer<Float>です。しかし、それはそれらのポインタのNumChannels価値があるはずです。だからこそ私はa in 0..<numChansを添え字に使用しています。しかし、私はちょうどFloatを取得します。

EDIT:

HM、chans.advanced(by: a)を使用しての代わりに添字思わ固定のもの

ここ

答えて

2

は、私が見つけたものです:

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

これは想定しているバッファは、あなたのAVAudioPCMBufferの名前です。

こうすれば、ポインタを避けることができます。これははるかに簡単です。これで、forループを使用して実際にデータを検索できます。

関連する問題