Swift AVAudioEngine AVAudioPCMBuffer to PowerLevel

Я работаю над проектом по созданию приложения, которое отображает уровень мощности с микрофона. Мне известен класс AVAudioRecorder, который обеспечивает среднюю/пиковую мощность, но я хочу иметь возможность записывать уровень мощности только для определенных диапазонов. Я использовал класс AudioUnitEQ для настройки полос, подключил его к AVAudioEngine и начал запись. В настоящее время я использую метод installTap для получения AVAudioPCMBuffer, где я застрял. Есть ли способ преобразовать это в уровень мощности? Кроме того, может ли мой подход к этому быть совершенно неправильным?


person Chris Davis    schedule 01.11.2017    source источник


Ответы (1)


Вы можете получить 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))
}
person woosiki    schedule 06.11.2017
comment
В настоящее время у меня есть что-то подобное, моя проблема в том, что возвращаемый floatChannelData является указателем на UnsafeMutablePointer of Float. Мое знакомство с C API очень низкое, и я получаю сообщение об ошибке в операторе guard let, потому что floatChannelData не имеет первого члена. Не могли бы вы уточнить немного больше, пожалуйста? - person Chris Davis; 07.11.2017
comment
Это моя ошибка. Пример кода необходимо сначала изменить на [0]. Я изменю пример кода. Спасибо, что нашли ошибку. :) - person woosiki; 07.11.2017