为什么我的 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 那里得到了这个代码。
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
}
精灵保持静止。不施加脉冲。我的问题是什么?
参考文献:
我建议检查是否存在任何录音错误 (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
它看起来像一个数组,它从零开始。
我正在尝试让我的应用对拍手声或高于正常声级的声音做出反应。我为此使用 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
}
精灵保持静止。不施加脉冲。我的问题是什么?
参考文献:
我建议检查是否存在任何录音错误 (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
它看起来像一个数组,它从零开始。