2016-07-07 17 views
0

私はiOSデバイスでdBを検出しようとしていますが、私はAVオーディオファンデーションにとって初めてです。私はこの投稿に出会った:iOS - Detect Blow into Mic and convert the results! (swift)、それは私のために働いていない。最大dBスウィフトを検出する方法

私の現在のコードはこれです:

import Foundation 
import UIKit 
import AVFoundation 
import CoreAudio 

class ViewController: UIViewController { 

var recorder: AVAudioRecorder! 
var levelTimer = NSTimer() 
var lowPassResults: Double = 0.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //make an AudioSession, set it to PlayAndRecord and make it active 
    var audioSession:AVAudioSession = AVAudioSession.sharedInstance() 
    audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: nil) 
    audioSession.setActive(true, error: nil) 

    //set up the URL for the audio file 
    var documents: AnyObject = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] 
    var str = documents.stringByAppendingPathComponent("recordTest.caf") 
    var url = NSURL.fileURLWithPath(str as String) 

    // make a dictionary to hold the recording settings so we can instantiate our AVAudioRecorder 
    var recordSettings: [NSObject : AnyObject] = [AVFormatIDKey:kAudioFormatAppleIMA4, 
                AVSampleRateKey:44100.0, 
                AVNumberOfChannelsKey:2,AVEncoderBitRateKey:12800, 
                AVLinearPCMBitDepthKey:16, 
                AVEncoderAudioQualityKey:AVAudioQuality.Max.rawValue 

    ] 

    //declare a variable to store the returned error if we have a problem instantiating our AVAudioRecorder 
    var error: NSError? 

    //Instantiate an AVAudioRecorder 
    recorder = AVAudioRecorder(URL:url, settings: recordSettings, error: &error) 
    //If there's an error, print otherwise, run prepareToRecord and meteringEnabled to turn on metering (must be run in that order) 
    if let e = error { 
     print(e.localizedDescription) 
    } else { 
     recorder.prepareToRecord() 
     recorder.meteringEnabled = true 

     //start recording 
     recorder.record() 

     //instantiate a timer to be called with whatever frequency we want to grab metering values 
     self.levelTimer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: #selector(ViewController.levelTimerCallback), userInfo: nil, repeats: true) 

    } 

} 

//This selector/function is called every time our timer (levelTime) fires 
func levelTimerCallback() { 
    //we have to update meters before we can get the metering values 
    recorder.updateMeters() 

    //print to the console if we are beyond a threshold value. Here I've used -7 
    if recorder.averagePowerForChannel(0) > -7 { 
     print("Dis be da level I'm hearin' you in dat mic ") 
     print(recorder.averagePowerForChannel(0)) 
     print("Do the thing I want, mofo") 
    } 
} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

答えて

3

私は現在、映画制作についての私のアプリを構築し、dBで音のレベルを計測する方法について何かを学びました。

recorder.averagePowerForChannelの原点データが実際に音のdBレベルではない、それは-160であるレベル範囲提供です - 0を、私たちは

このデータは、より合理的にするためにいくつかの変更が必要

私はこのデータ(値)をdBレベルのデータに変換するいくつかのものを見つけていました。

(私はそれを発見された場所については申し訳ありませんが、忘れてしまった!)ここ

は、私はそれが私のコードと少し異なるものになりますので、あなたは聖霊降臨祭の2つのチャンネルを記録していることに気づいたコード

/** 
Format dBFS to dB 

- author: RÅGE_Devil_Jåmeson 
- date: (2016-07-13) 20:07:03 

- parameter dBFSValue: raw value of averagePowerOfChannel 

- returns: formatted value 
*/ 
func dBFS_convertTo_dB (dBFSValue: Float) -> Float 
{ 
var level:Float = 0.0 
let peak_bottom:Float = -60.0 // dBFS -> -160..0 so it can be -80 or -60 

if dBFSValue < peak_bottom 
{ 
    level = 0.0 
} 
else if dBFSValue >= 0.0 
{ 
    level = 1.0 
} 
else 
{ 
    let root:Float    = 2.0 
    let minAmp:Float   = powf(10.0, 0.05 * peak_bottom) 
    let inverseAmpRange:Float = 1.0/(1.0 - minAmp) 
    let amp:Float    = powf(10.0, 0.05 * dBFSValue) 
    let adjAmp:Float   = (amp - minAmp) * inverseAmpRange 

    level = powf(adjAmp, 1.0/root) 
} 
return level 
} 

です。ああ、ところで、 `averagePowerForChannel` *は*リターンデシベルを行い、迅速

+0

変更コーディング言語をD

LAST UPDATE:

願いはあなたを助けるか、あなたにいくつかのアイデアを与えることができます。 [dbFS](https://en.wikipedia.org/wiki/DBFS)であるため、-160から0になります。 -160は無音を意味し、それはフルレベルである0まですべて*アップ*します。 – Moritz

+1

ああ、thx言語の言及について(そしてwikiもちろん:))。答えのコードをすばやく書き直して、自分の答えをできるだけ早く修正しようとします。 –

+0

助けてくれてありがとう:) –

関連する問題