如何使用 swift 监控 ios 上的音频输入 - 示例?

Posted

技术标签:

【中文标题】如何使用 swift 监控 ios 上的音频输入 - 示例?【英文标题】:how to monitor audio input on ios using swift - example? 【发布时间】:2016-03-11 00:22:15 【问题描述】:

我想编写一个简单的应用程序,当麦克风的声音级别达到一定级别时“做某事”,显示音频输入级别以获得额外奖励

在 swift 中找不到任何涉及到这一点的示例——不想记录,只是监视

一直在查看有关 AVFoundation 课程的文档,但无法启动

谢谢

【问题讨论】:

【参考方案1】:

让你可以使用下面的代码:

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()
            

        

【讨论】:

在哪里声明 lowPassResults 变量? @RaviSharma ,你可以在类的顶部声明lowPassResults。【参考方案2】:

AVAudioRecorder你可以“录制音频”(你不必保存它)并设置meteringEnabled使用peakPowerForChannel(_:)功能

会的

返回给定通道的峰值功率,以分贝为单位,用于录制的声音。

This link may provide a sample code.

如果对你有帮助,请告诉我。

【讨论】:

它仍然会写入文件。

以上是关于如何使用 swift 监控 ios 上的音频输入 - 示例?的主要内容,如果未能解决你的问题,请参考以下文章

在不录制的情况下监控 iPhone 上的音频输入?

如何使用 Swift 在 iOS 中同时录制和播放音频?

如何在 iOS 中使用 swift 共享远程音频文件

如何在 Swift 2 的 iOS 应用程序中使用音频?

Swift 4 AVFoundation - 同时录制多个音频源

如何使用 Swift 从 iOS 应用程序共享音频/图像到 whatsapp