Я работаю над проектом по созданию приложения, которое отображает уровень мощности с микрофона. Мне известен класс AVAudioRecorder, который обеспечивает среднюю/пиковую мощность, но я хочу иметь возможность записывать уровень мощности только для определенных диапазонов. Я использовал класс AudioUnitEQ для настройки полос, подключил его к AVAudioEngine и начал запись. В настоящее время я использую метод installTap для получения AVAudioPCMBuffer, где я застрял. Есть ли способ преобразовать это в уровень мощности? Кроме того, может ли мой подход к этому быть совершенно неправильным?
Swift AVAudioEngine AVAudioPCMBuffer to PowerLevel
Ответы (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
В настоящее время у меня есть что-то подобное, моя проблема в том, что возвращаемый floatChannelData является указателем на UnsafeMutablePointer of Float. Мое знакомство с C API очень низкое, и я получаю сообщение об ошибке в операторе guard let, потому что floatChannelData не имеет первого члена. Не могли бы вы уточнить немного больше, пожалуйста?
- person Chris Davis; 07.11.2017
Это моя ошибка. Пример кода необходимо сначала изменить на [0]. Я изменю пример кода. Спасибо, что нашли ошибку. :)
- person woosiki; 07.11.2017