当前位置: 首页 > 面试题库 >

iOS-检测“吹入麦克风”并转换结果!(迅速)

呼延源
2023-03-14
问题内容

我需要快速开发一个iOS应用程序,以检测用户的麦克风是否受到打击。这必须是一个挑战游戏,其中两个玩家必须一个接一个地吹入iPhone麦克风。分贝值应以米或公里为单位进行测量和换算,以便我确定获胜者。“进一步打击”的玩家(玩家1:50公里,玩家2:70公里)获胜。

这可能吗?

我很快就收到了这段代码,但我不知道如何进行:

import Foundation
import UIKit
import AVFoundation
import CoreAudio

class ViewController: UIViewController {
// @IBOutlet weak var mainImage: UIImageView!

var recorder: AVAudioRecorder!
var levelTimer = NSTimer()
var lowPassResults: Double = 0.0
override func viewDidLoad() {
    super.viewDidLoad()
    let url = NSURL.fileURLWithPath("dev/null")
    //numbers are automatically wrapped into NSNumber objects, so I simplified that to [NSString : NSNumber]
    var settings : [NSString : NSNumber] = [AVSampleRateKey: 44100.0, AVFormatIDKey: kAudioFormatAppleLossless, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.Max.rawValue]
    var error: NSError?
   // mainImage?.image = UIImage(named: "flyForReal.png");
    recorder = AVAudioRecorder(URL:url, settings:settings, error:&error)

    if((recorder) != nil){
        recorder.prepareToRecord()
        recorder.meteringEnabled = true
        recorder.record()
        levelTimer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: Selector("levelTimerCallback"), userInfo: nil, repeats: true)
    }
    else{
        NSLog("%@", "Error");
    }
}
func levelTimerCallback(timer:NSTimer) {
    recorder.updateMeters()

    let ALPHA: Double = 0.05
    var peakPowerForChannel = pow(Double(10), (0.05 * Double(recorder.peakPowerForChannel(0))))
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
    if(lowPassResults > 0.95){
        NSLog("@Mic blow detected");
    }
    NSLog("@Average input: %f Peak input: %f Low pass results: %f", recorder.averagePowerForChannel(0), recorder.peakPowerForChannel(0), lowPassResults);
 }
}

谢谢你!


问题答案:

关。您有几个问题。您的选择器调用使该应用程序崩溃,因为您没有传递参数并且levelTimerCallback()需要一个参数。

averagePowerPerChannel 似乎给了我更实时的测光,所以我用它代替了 peakPowerPerChannel

另外,您需要设置音频会话。我不确定那个数学到底是什么,所以我在这里摆脱了它。我在下面粘贴了整个视图控制器,以进行基本的麦克风检测。

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, error: 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 that shit - otherwise, run prepareToRecord and meteringEnabled to turn on metering (must be run in that order)
    if let e = error {
        println(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("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 ")
        println(recorder.averagePowerForChannel(0))
        println("Do the thing I want, mofo")
    }
}



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


}


 类似资料:
  • 使用光环板制作一个音量检测计,通过光环板的麦克风检测音量大小,并通过可视化的形式呈现出来,音量越大,LED灯环亮起的灯就越多。 1. 从事件类积木拖取一个 当按钮被按下时 积木。 2. 从控制类积木拖取一个 重复执行 积木。 3. 从灯光类积木拖取一个 显示LED环形图()% 积木,再添加一个传感器类积木 麦克风 响度。 4. 试着拍下桌子,看光环板LED环形图的变化吧! 下载代码

  • 问题内容: 我有一个应用程序可以点击麦克风,还可以根据麦克风输入播放声音(不必同时通过tho)。下面的代码有效。但是一个问题是输出在小型顶部扬声器而不是底部真实扬声器上播放。我可以通过 在播放器开始播放之前 将3行放在下面来奇怪地解决此问题,然后我可以听到扬声器上的声音。 但是,麦克风停止收听 !即使在播放器停止播放之后。基本上麦克风不喜欢 .defaultToSpeaker 任何想法? 这里也记

  • 问题内容: 随着iOS 7的引入,应用程序在想要录制音频时必须请求访问麦克风。 如何检查应用程序是否可以访问麦克风? 在iOS 8 SDK中,我可以使用枚举,但是如何在iOS 7中进行检查? 信息: 我不想请求权限,我只想检查应用程序是否可以访问麦克风。(例如位置访问权限): 问题答案: 在这种情况下,无法获取..的当前状态。他们已将枚举指定为AVAudioSessionRecordPermiss

  • 问题内容: 我将如何使用pyaudio来检测现场麦克风的突然敲击声? 问题答案: 我这样做的一种方式: 一次读取一块样本,比如说值得0.05秒 计算块的RMS幅度(各个样本的平方的平均值的平方根) 如果块的RMS幅度大于阈值,则为“嘈杂的块”,否则为“安静的块” 突然的敲击将是一个安静的区域,然后是少量的噪音区域,然后是一个安静的区域 如果您从不安静,则门槛太低 如果您从不听到嘈杂的声音,则您的门

  • 我想直播Android麦克风,可以使用VLC播放器等听到。 Playstore主要提供IP摄像头应用,但这些应用是通过内部网络实现的。我想在互联网上播放流媒体。 可能吗? 我尝试了以下代码片段,但目前不起作用: 在VLC播放器前,我试着听(媒体)- 还有别的办法吗?

  • 播放音符 播放声音 录制 文字转语音