为什么我的 update() 函数对 dB 水平没有反应?

Why is my update() function not reacting on dB levels?

我正在尝试让我的应用对拍手声或高于正常声级的声音做出反应。我为此使用 Swift 和 SpriteKit。我已经导入了 AVFoundation,当然还有 SpriteKit。这是我的设置:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
.UserDomainMask, true)

let docsDir = dirPaths[0] as! String

let soundFilePath =
docsDir.stringByAppendingPathComponent("sound.caf")

let soundFileURL = NSURL(fileURLWithPath: soundFilePath)

let recordSettings =
[AVEncoderAudioQualityKey: AVAudioQuality.Min.rawValue,
AVEncoderBitRateKey: 16,
AVNumberOfChannelsKey: 1,
AVSampleRateKey: 44100.0]

let sprite = SKSpriteNode(imageNamed: "Apple_Swift_Logo")
let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: nil)
var impulseAdded = false

我从 this site 那里得到了这个代码。

GameScenedidMoveToView() 内的下一个:

//sprite
    sprite.position = CGPointMake(320, 568)
    addChild(sprite)

//recorder; meteringEnabled set to true to allow access to dB levels
    recorder.meteringEnabled = true
    recorder.record()

最后在 update() 函数中:

recorder.updateMeters()
 if recorder.averagePowerForChannel(1) > -160 && impulseAdded == false {
    sprite.physicsBody?.applyImpulse(CGVector(dx: 0,dy: 100))
    impulseAdded = true
}        

精灵保持静止。不施加脉冲。我的问题是什么?

参考文献:

我建议检查是否存在任何录音错误 (from this answer)。

var error : NSError?
AVAudioSession.sharedInstance.setCategory(AVAudioSessionCategoryPlayAndRecord, error:&error)

if let anError = error {
    NSLog("Error description: \(anError)")
}

或者你的情况

var error : NSError?
let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: &error)
if let anError = error {
    NSLog("Error description: \(anError)")
}

var success = recorder.record()
NSLog("recorded successfully? \(success)")

这一切都归结为这行代码:

AVNumberOfChannelsKey: 1

它在 recordSettings.

然后在 update() 函数中这个 if recorder.averagePowerForChannel(1) > -160 必须更改为:

if recorder.averagePowerForChannel(0) > -160

它看起来像一个数组,它从零开始。