Ios 使用AVAudioPlayer时出现OSStatus错误2003334207

Ios 使用AVAudioPlayer时出现OSStatus错误2003334207,ios,swift,avaudioplayer,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

我试图在按下按钮时播放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\u断点发生在
audioPlayer.delegate=self

StackooOverflow上的其他线程没有帮助。有什么想法吗? 谢谢


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

看起来您正在尝试打开一个值为零的变量。您应该安全地展开变量以防止出现这种情况

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在返回一个对象吗 全部
  • 你确定这是一集吗

您正在检查音频播放器是否为
nil
,但随后您继续使用它,就好像它不是那样。您可能需要以下内容:

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

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

在我的案例中,我遇到了同样的问题,我发现我需要在开始录制之前设置这个

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

希望它能帮助任何人

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


请确保url路径位于文档目录下

这可能是因为试图加载一个不存在的文件。如果这有助于某人将调用添加到
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)")
    }

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

这帮助了我:

基本上,您不能加载带有绝对引用的文件,因为沙盒环境每次都会重新生成绝对文件url。因此,您需要添加一小段代码(见上文)以获得正确的URL使用。

试试这个

var player: AVAudioPlayer = AVAudioPlayer()


@IBAction func playX(_ sender: Any) {
    let urlstring = "https://file-examples-com.github.io/uploads/2017/11/file_example_MP3_700KB.mp3"
    let url = URL(string: urlstring)
    let data = try! Data(contentsOf: url!)
    player = try! AVAudioPlayer(data: data)
    player.prepareToPlay()
    player.volume = 1.0
    player.play()
}

你完全正确。这只是权宜之计,不是最终的。我添加了一个else语句,它不再使应用程序崩溃,但仍然抛出相同的错误。谢谢,你是对的。应用程序仍然抛出相同的错误。fetchedResultsController返回正确的CDSpoint类型的对象。我的CoreData数据库中存在错误。这个问题现在已经解决了。多亏了您和@danI查找了错误代码,2003334207给出了localizedDescription“操作无法完成”。在我的应用程序中,我试图访问一个不存在的文件。