2017-03-10 6 views
3

AVAudioEngine 그래프로 재생중인 mp3 파일의 원시 PCM 샘플에 대한 계산을 시도하고 있습니다. 나는 AVAudioPCMBuffer을 제공하는 44100 샘플마다 마감 처리를하고 있습니다. 이 유형은 channelData이고 유형은 UnsafePointer<UnsafeMutablePointer<Float>>?입니다. Swift 3에서 포인터로 작업하지 않았으므로이 Float 값에 액세스하는 방법이 확실하지 않습니다.처리를 위해 AVAudioPCMBuffer의 플로트 샘플에 액세스

나는 다음과 같은 코드를 가지고 있지만 많은 문제가 있습니다 : 나는 N 버퍼의 채널 수는 N 플로트 포인터가있는 UnsafeMutablePointer<Float의 반복 어떻게 예를 들어

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

는. 이 클래스의 Apple 문서에서 버퍼 샘플에 액세스하는 방법에 대한 설명을 찾을 수 없습니다.

주된 문제는 let samples = chans[a]이라고 생각합니다. Xcode는 chansUnsafeMutablePointer<Float>이라고 말합니다. 하지만 NumChannels 가치가 있어야합니다. 그래서 내가 첨자로 a in 0..<numChans을 사용하는 이유입니다. 그러나 내가 할 때 나는 단지 Float이된다.

편집 :

흠, chans.advanced(by: a)를 사용하는 대신에 첨자 보인다 고정 일

다음

답변

2

내가 발견 한 것입니다 :

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

이 가정되어 버퍼가 당신의 AVAudioPCMBuffer의 이름입니다.

이렇게하면 포인터를 피할 수 있으므로 훨씬 간단 해집니다. 이제 for 루프를 사용하여 실제로 데이터를 검색 할 수 있습니다.