使用AVAudioPlayer时OSStatus错误2003334207

时间:2015-03-16 23:13:37

标签: ios swift avaudioplayer

按下按钮时,我正在尝试播放MP3文件(通过VLC / iTunes播放时有效)。这是我的代码:

     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对象)但仍然失败。

6 个答案:

答案 0 :(得分:4)

看起来你试图打开一个零值的变量。您应该安全地展开变量以防止这种情况发生。

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
}

你仍然需要弄清楚它返回nil的原因,但这是一种更安全的解包变量和防止崩溃的方法,因为需要更多的上下文来解决这个问题。

要研究的一些问题:

  • 您确定fetchedResultsController正在返回一个对象 所有?
  • 你确定它是CDEpisode吗?

答案 1 :(得分:4)

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

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

做一些事情来实际处理错误案例,而不仅仅是打印错误。

答案 2 :(得分:2)

这可能是由于尝试加载不存在的文件引起的。如果这样可以帮助将通话添加到url.checkResourceIsReachable()的人记录更多描述性消息。

示例代码:

    do {
        let url = URL(fileURLWithPath: dbObject.path)
        let isReachable = try url.checkResourceIsReachable()
        // ... you can set breaking points after that line, and if you stopped at them it means file exist.
    } catch let e {
        print("couldnt load file \(e.localizedDescription)")
    }

答案 3 :(得分:0)

在我的情况下,我遇到了同样的问题,我发现我需要在开始录制之前设置它

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

希望它可以帮助任何人

答案 4 :(得分:0)

我也遇到了这个问题,在检查了音频文件url之后,发现它存储在Cache目录中。所以音频播放器可能根据你的“url”找不到音频文件。

请确保,url路径位于Document目录下。

答案 5 :(得分:0)

正如其他人所说,音频播放器找不到文件。

这对我有帮助:Document directory path change when rebuild application

基本上,您不能使用绝对引用加载文件,因为沙箱环境每次都会重新生成绝对文件url。因此,您将需要添加少量代码(请参见上文)以获取要使用的正确网址。