我试图让我的应用对拍手或高于正常声级做出反应。我为此使用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获得了此代码。
接下来是GameScene
和didMoveToView()
:
//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
}
精灵保持静止。没有冲动。我的问题在这里是什么?
参考文献:
答案 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)")