2017-11-01 20 views
0

저는 프로젝트에서 마이크의 출력 레벨을 표시하는 응용 프로그램을 만드는 중입니다. AVAudioRecorder 클래스에서 평균/최대 전력을 제공하는 것을 알고 있지만 특정 대역의 전력 레벨 만 기록 할 수 있기를 원합니다. AudioUnitEQ 클래스를 사용하여 밴드를 설정하고이를 AVAudioEngine에 연결하여 녹음을 시작했습니다. 현재 installTap 메서드를 사용하여 AVAudioPCMBuffer를 얻었습니다. 이것을 전력 수준으로 변환 할 수있는 방법이 있습니까? 또한, 내 접근 방식이 완전히 잘못 될 수 있습니까?Swift AVAudioEngine AVAudioPCMBuffer to PowerLevel

답변

0

이 코드처럼 avg/peek을 얻을 수 있습니다.

engine.installTap(......) { buffer in 
    guard let data = buffer.floatChannelData?[0] else { 
     return 
    } 
    var dbData = [Float](repeating: 0.0, count: data.count) 
    var one: Float = 0.0 
    vDSP_vdbcon(&data, 1, &one, &dbData, 1, data.count, 1) 

    var avgLevel: Float = 0.0 
    var peakLevel: Float = 0.0 
    vDSP_rmsqv(dbData, 1, &avgLevel, vDSP_Length(buffer.frameLength)) 
    vDSP_maxmgv(dbData, 1, &peakLevel, vDSP_Length(buffer.frameLength)) 
} 
+0

현재 비슷한 설정이 있는데, 내 문제는 반환되는 floatChannelData가 Float의 UnsafeMutablePointer에 대한 포인터라는 것입니다. floatChannelData에는 멤버가 처음부터 없기 때문에 C API에 대한 내 친숙도가 매우 낮으며 guard let 문에 오류가 발생합니다. 조금 더 자세하게 설명해 주시겠습니까? –

+0

그건 내 실수 야. 샘플 코드는 "first"를 [0]으로 변경해야합니다. 나는 샘플 코드를 바꿀 것이다. 실수를 찾아 주셔서 감사합니다. :) – woosiki