2016-04-21 3 views
2

Я пытаюсь получить значение децибела из AVAudio Recorder. Это мой код в настоящее время. У меня есть метод запуска рекордера, а затем метод для чтения значений децибел.Получение децибел из AVAudioRecorder

var recorder: AVAudioRecorder! 

Recorder определен глобально, то здесь используется:

func init_recorder() -> Void 
{ 
    let recordersettings = [ 
     AVFormatIDKey: Int(kAudioFormatAppleIMA4), 
     AVSampleRateKey: 44100, 
     AVNumberOfChannelsKey: 1 as NSNumber, 
     AVLinearPCMBitDepthKey: 16, 
     AVLinearPCMIsFloatKey: false, 
     AVLinearPCMIsBigEndianKey: false, 
     //AVEncoderAudioQualityKey: AVAudioQuality.High.rawValue 
    ] 
    let filename = NSURL(fileURLWithPath: NSTemporaryDirectory().stringByAppendingString("tmp.caf")) 

    do 
    { 
     recorder = try AVAudioRecorder(URL: filename, settings: recordersettings) 
     recorder.meteringEnabled = true 
     recorder.prepareToRecord() 
     recorder.record() 
     recorder.updateMeters() 

    } 
    catch 
    { 
     print("error") 
    } 


} 

Затем, чтобы получить значение децибел у меня есть

func get_decibels() -> Float 
{ 
    recorder.updateMeters() 
    return recorder.averagePowerForChannel(0) 
} 

По какой-то причине это возвращающее значение -120.0 каждый раз это называется, и я не слишком уверен, почему. Я прочитал от http://b2cloud.com.au/tutorial/obtaining-decibels-from-the-ios-microphone/ и несколько других потоков переполнения стека, но большинство примеров, похоже, очень похожи на мои.

Любая помощь приветствуется, большое спасибо!

+1

Возможный дубликат [AVAudioRecorder averagePowerForChannel всегда возвращает -120.0] (http://stackoverflow.com/questions/5022514/avaudiorecorder-averagepowerforchannel-always-returns-120-0) –

ответ

0

После inited в AVAudioSession

let session = AVAudioSession.sharedInstance() 
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
    try session.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) 
    try session.setActive(true) 
try recorder = AVAudioRecorder(url: getDocumentsDirectory(), settings: settings) 

и начал рекордер

func start() { 
    recorder?.record() 
    recorder?.updateMeters() 
} 

Вы можете получить по телефону децибел

let decibels = recorder.averagePower(forChannel: 0) 

от -120 (минимального значения) до 0. Уровень шума в каком-либо кафе, например, составляет -20

вот более подробный пример http://www.mikitamanko.com/blog/2017/04/15/swift-how-to-get-decibels/