使用AVAudioPlayer时OSStatus错误2003334207

我试图播放MP3文件(当通过VLC / iTunes播放时)按下button时。 这是我的代码:

var audioPlayer: AVAudioPlayer! @IBAction func playEpisode(sender: AnyObject) { println("now playing") let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode var err: NSError? let url = NSURL(string: data.localPath) println("The url is \(url)") audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &err) if audioPlayer == nil { if let e = err { println(e.localizedDescription) } } audioPlayer.delegate = self audioPlayer.prepareToPlay() audioPlayer.play() } 

这里是日志:

 now playing The url is Optional(file:///var/mobile/Containers/Data/Application/4747A71E-A63F-4EFC-B2DF-8B361361080B/Documents/serial-s01-e12.mp3) The operation couldn't be completed. (OSStatus error 2003334207.) fatal error: unexpectedly found nil while unwrapping an Optional value 

EXC_BREAKPOINT发生在audioPlayer.delegate = self

StackoOverflow上的其他线程没有帮助。 有任何想法吗? 谢谢

编辑 :我曾尝试将localURL传递给contentsOfURL(而不是CDEpisode对象),它仍然失败。

它看起来像你试图解开一个无价值的variables。 你应该安全地打开你的variables来防止这种情况。

 if let data: CDEpisode = fetchedResultsController.objectAtIndexPath(indexPath!) as! CDEpisode { var err: NSError? let url = NSURL(string: data.localPath) println("The url is \(url)") //rest of code } 

你仍然需要弄清楚为什么它返回零,但这是一个更安全的方式来打开variables,并防止崩溃,因为需要更多的上下文来解决这个问题。

有些问题需要研究:

  • 你确定fetchedResultsController是否返回一个对象?
  • 你确定它是CDEpisode吗?

你正在检查audioPlayer是否nil但你继续使用它,就好像它不是。 你可能想要像这样的东西:

 if audioPlayer == nil { if let e = err { println(e.localizedDescription) } } else { audioPlayer.delegate = self audioPlayer.prepareToPlay() audioPlayer.play() } 

并且做一些事情来处理错误情况,而不是仅仅打印错误。

在我的情况下,我有同样的问题,我发现我需要在开始录制之前设置此

 try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 

希望它能帮助任何人