2017-01-24 8 views
0

AVCaptureAudioDataOutput을 사용하여 오디오 입력을 분석하려고합니다 (here). 이것은 내가 스스로 알아낼 수있는 것이 아니므로 예제를 복사하고 있지만 어려움을 겪고 있습니다.스위프트 3 : AVCaptureAudioDataOutput을 사용하여 오디오 입력을 분석하십시오.

스위프트 3의 Xcode는 몇 가지 변경을 요구했습니다. samples을 할당하는 줄에서 컴파일 오류가 발생합니다. 엑스 코드가 말한다 "유형의 초기화를 호출 할 수 없습니다 '형식의 인수 목록에 UnsafeMutablePointer < _>는'(? UnsafeMutableRawPointer) '"

여기에 내가 수정 한대로 코드입니다 :

func captureOutput(_ captureOutput: AVCaptureOutput!, 
        didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, 
        from connection: AVCaptureConnection!){ 
    var buffer: CMBlockBuffer? = nil 
    var audioBufferList = AudioBufferList(mNumberBuffers: 1, 
              mBuffers: AudioBuffer(mNumberChannels: 1, mDataByteSize: 0, mData: nil)) 
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
     sampleBuffer, 
     nil, 
     &audioBufferList, 
     MemoryLayout<AudioBufferList>.size,  // changed for Swift 3 
     nil, 
     nil, 
     UInt32(kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment), 
     &buffer 
    ) 
    let abl = UnsafeMutableAudioBufferListPointer(&audioBufferList) 
    var sum:Int64 = 0 
    var count:Int = 0 
    var bufs:Int = 0 
    for buf in abl { 
     let samples = UnsafeMutableBufferPointer<Int16>(start: UnsafeMutablePointer(buf.mData), // Error here 
                 count: Int(buf.mDataByteSize)/sizeof(Int16)) 
     for sample in samples { 
      let s = Int64(sample) 
      sum = (sum + s*s) 
      count += 1 
     } 
     bufs += 1 
    } 
    print("found \(count) samples in \(bufs) buffers, sum is \(sum)") 
} 

사람이 수 이 코드를 수정하는 방법을 알려주십시오.

답변

0

답변은 OpaquePointerbuf.mData을 입력해야한다는 것입니다. 즉, UnsafeMutableBufferPointer<Int16>(OpaquePointer(buff.mData))에 대한 호출에 변경

start: UnsafeMutablePointer(buff.mData) 

여기

start: UnsafeMutablePointer(OpaquePointer(buff.mData)) 

하는 것입니다 스위프트 3 업데이트 전체 코드 :

func captureOutput(_ captureOutput: AVCaptureOutput!, 
        didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, 
        from connection: AVCaptureConnection!){ 
    var buffer: CMBlockBuffer? = nil 
    var audioBufferList = AudioBufferList(mNumberBuffers: 1, 
              mBuffers: AudioBuffer(mNumberChannels: 1, mDataByteSize: 0, mData: nil)) 
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
     sampleBuffer, 
     nil, 
     &audioBufferList, 
     MemoryLayout<AudioBufferList>.size, 
     nil, 
     nil, 
     UInt32(kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment), 
     &buffer 
    ) 
    let abl = UnsafeMutableAudioBufferListPointer(&audioBufferList) 
    var sum:Int64 = 0 
    var count:Int = 0 
    var bufs:Int = 0 
    for buff in abl { 
     let samples = UnsafeMutableBufferPointer<Int16>(start: UnsafeMutablePointer(OpaquePointer(buff.mData)), 
                 count: Int(buff.mDataByteSize)/MemoryLayout<Int16>.size) 
     for sample in samples { 
      let s = Int64(sample) 
      sum = (sum + s*s) 
      count += 1 
     } 
     bufs += 1 
    } 
    print("found \(count) samples in \(bufs) buffers, RMS is \(sqrt(Float(sum)/Float(count)))") 
} 

이 컴파일러를 만족하고,이 보인다 합리적인 숫자를 생성합니다.