该应用程序运行正常,但只要我点击chipmunkButton应用程序崩溃并提供以下错误:
错误:AVAudioPlayerNode.mm:678: - [AVAudioPlayerNode scheduleFile:atTime:completionHandler:]:必需条件为false: file!= nil 2015-05-10 17:24:25.269 Pitch Perfect [50278:1897012] *** 由于未捕获的异常而终止应用程序 'com.apple.coreaudio.avfaudio',原因:'所需条件为假: file!= nil'
import UIKit
import AVFoundation
class PlaySoundsViewController: UIViewController {
var audioRecording = AVAudioPlayer()
var receivedAudio:RecordedAudio!
var audioEngine:AVAudioEngine!
var audioFile:AVAudioFile!
func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer {
//1
var path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
var url = NSURL.fileURLWithPath(path!)
//2
var error: NSError?
//3
var audioPlayer:AVAudioPlayer?
audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
//4
return audioPlayer!
}
override func viewDidLoad() {
super.viewDidLoad()
audioRecording = AVAudioPlayer(contentsOfURL: receivedAudio.filePathUrl, error: nil)
audioRecording.enableRate = true
audioEngine = AVAudioEngine()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func slowButton(sender: UIButton) {
playButtons()
audioRecording.rate = 0.5
}
@IBAction func fastSound(sender: UIButton) {
audioRecording.rate = 2.0
playButtons()
}
@IBAction func chipmunkButton(sender: UIButton) {
playAudioWithVariablePitch(1000)
}
func playAudioWithVariablePitch(pitch: Float) {
audioRecording.stop()
audioEngine.stop()
audioEngine.reset()
var audioPlayerNode = AVAudioPlayerNode()
audioEngine.attachNode(audioPlayerNode)
var changePitchEffect = AVAudioUnitTimePitch()
changePitchEffect.pitch = pitch
audioEngine.attachNode(changePitchEffect)
audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil)
audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil)
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
audioEngine.startAndReturnError(nil)
audioPlayerNode.play()
}
@IBAction func stopButton(sender: UIButton) {
audioRecording.stop()
}
func playButtons() {
audioRecording.stop()
audioRecording.currentTime = 0
audioRecording.play()
}
}
答案 0 :(得分:5)
非常小学。只需阅读错误信息!你在说:
var audioFile:AVAudioFile!
这意味着audioFile
为零。好吧,之后你永远不会触摸audioFile
,所以它从零开始并保持为零。因此,当你到达这一行时,你崩溃了:
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
...完全是因为audioFile
是零。
答案 1 :(得分:0)
如亚特提到的,audioFile是零
所以要解决这个问题,你必须进行设置。查看代码,您应该使用
audioFile = AVAudioFile(forReading: receivedAudio.filePathUrl, error: nil)
这将设置audioFile,代码不会崩溃!