为什么我的update()函数不对dB级别做出反应?

时间:2015-05-19 19:51:47

标签: ios swift avfoundation

我试图让我的应用对拍手或高于正常声级做出反应。我为此使用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
}        

精灵保持静止。没有冲动。我的问题在这里是什么?

参考文献:

2 个答案:

答案 0 :(得分:1)

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

AVNumberOfChannelsKey: 1

它位于recordSettings

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

if recorder.averagePowerForChannel(0) > -160

它似乎像数组一样工作,它从零开始。

答案 1 :(得分:0)

我建议检查是否有任何录音错误(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)")