如何使用swift监视ios上的audioinput – 示例?
我想写一个简单的应用程序,当麦克风的声级达到一定水平时,“做些什么”,显示audioinput级别的额外功劳
不能在swift中find任何这样的例子 – 不想logging,只是监视
已经检查了AVFoundation类的文档,但不能离开地面
谢谢
让你可以使用下面的代码:
func initalizeRecorder () { do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) try AVAudioSession.sharedInstance().setActive(true) }catch{ print(error); } let stringDir:NSString = self.getDocumentsDirectory(); let audioFilename = stringDir.stringByAppendingPathComponent("recording.m4a") let audioURL = NSURL(fileURLWithPath: audioFilename) print("File Path : \(audioFilename)"); // make a dictionary to hold the recording settings so we can instantiate our AVAudioRecorder let settings = [ AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000.0, AVNumberOfChannelsKey: 1 as NSNumber, AVEncoderBitRateKey:12800 as NSNumber, AVLinearPCMBitDepthKey:16 as NSNumber, AVEncoderAudioQualityKey: AVAudioQuality.High.rawValue ] do { if audioRecorder == nil { audioRecorder = try AVAudioRecorder(URL: audioURL, settings: settings ) audioRecorder!.delegate = self audioRecorder!.prepareToRecord(); audioRecorder!.meteringEnabled = true; } audioRecorder!.recordForDuration(NSTimeInterval(5.0)); } catch { print("Error") } } //GET DOCUMENT DIR PATH func getDocumentsDirectory() -> String { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentsDirectory = paths[0] return documentsDirectory } ////START RECORDING @IBAction func btnStartPress(sender: AnyObject) { recordingSession = AVAudioSession.sharedInstance() do { recordingSession.requestRecordPermission() { [unowned self] (allowed: Bool) -> Void in dispatch_async(dispatch_get_main_queue()) { if allowed { print("Allowd Permission Record!!") self.initalizeRecorder () self.audioRecorder!.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("levelTimerCallback"), userInfo: nil, repeats: true) } else { // failed to record! self.showPermissionAlert(); print("Failed Permission Record!!") } } } } catch { // failed to record! print("Failed Permission Record!!") } } //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 if audioRecorder != nil { audioRecorder!.updateMeters() let ALPHA : Double = 0.05; let peakPowerForChannel : Double = pow(Double(10.0), (0.05) * Double(audioRecorder!.peakPowerForChannel(0))); lowPassResults = ALPHA * peakPowerForChannel + Double((1.0) - ALPHA) * lowPassResults; print("low pass res = \(lowPassResults)"); if (lowPassResults > 0.7 ){ print("Mic blow detected"); } } } //STOP RECORDING @IBAction func btnStopPress(sender: AnyObject) { if audioRecorder != nil { audioRecorder!.stop() self.levelTimer.invalidate() } }
在AVAudioRecorder
你可以“录制audio”(你不必保存),并设置meteringEnabled
使用函数peakPowerForChannel(_:)
它会
返回给定通道的峰值功率,以分贝为单位logging声音。
此链接可能会提供一个示例代码 。
让我知道,如果它帮助你。