Swift:所需条件为假:文件 != nil
Swift: required condition is false: file != nil
该应用程序运行良好,但只要我点击 chipmunkButton,该应用程序就会崩溃并提供以下错误:
ERROR: AVAudioPlayerNode.mm:678: -[AVAudioPlayerNode
scheduleFile:atTime:completionHandler:]: required condition is false:
file != nil 2015-05-10 17:24:25.269 Pitch Perfect[50278:1897012] ***
Terminating app due to uncaught exception
'com.apple.coreaudio.avfaudio', reason: 'required condition is false:
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()
}
}
非常初级。只需阅读错误消息!你是说:
var audioFile:AVAudioFile!
这意味着 audioFile
为零。好吧,在那之后你再也不会碰 audioFile
了,所以它开始时为 nil 并保持为 nil。因此,当您到达这一行时,您会崩溃:
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
...正是因为 audioFile
为零。
正如 matt 提到的,audioFile 为 nil
因此,要解决此问题,您必须对其进行设置。看代码,应该用
audioFile = AVAudioFile(forReading: receivedAudio.filePathUrl, error: nil)
这将设置音频文件并且代码不会崩溃!
该应用程序运行良好,但只要我点击 chipmunkButton,该应用程序就会崩溃并提供以下错误:
ERROR: AVAudioPlayerNode.mm:678: -[AVAudioPlayerNode scheduleFile:atTime:completionHandler:]: required condition is false: file != nil 2015-05-10 17:24:25.269 Pitch Perfect[50278:1897012] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: 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()
}
}
非常初级。只需阅读错误消息!你是说:
var audioFile:AVAudioFile!
这意味着 audioFile
为零。好吧,在那之后你再也不会碰 audioFile
了,所以它开始时为 nil 并保持为 nil。因此,当您到达这一行时,您会崩溃:
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
...正是因为 audioFile
为零。
正如 matt 提到的,audioFile 为 nil
因此,要解决此问题,您必须对其进行设置。看代码,应该用
audioFile = AVAudioFile(forReading: receivedAudio.filePathUrl, error: nil)
这将设置音频文件并且代码不会崩溃!