【问题标题】:OSStatus error 2003334207 when using AVAudioPlayer使用 AVAudioPlayer 时出现 OSStatus 错误 2003334207
【发布时间】:2015-05-19 06:17:17
【问题描述】:

按下按钮时,我正在尝试播放 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 对象),但仍然失败。

【问题讨论】:

  • 我查看了错误代码,2003334207 给出了本地化描述“操作无法完成”。在我的应用中,我试图访问一个不存在的文件。

标签: ios swift avaudioplayer


【解决方案1】:

看起来您试图解开具有 nil 值的变量。您应该安全地解开变量以防止这种情况发生。

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 的吗?

【讨论】:

  • 谢谢,你是对的。该应用程序仍然抛出相同的错误。 fetchedResultsController 返回 CDEpisode 类型的正确对象。
  • 我的 CoreData 数据库出现错误。现在已修复。谢谢你和@dan
【解决方案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】:

    试试这个

    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()
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 你说的完全正确。这只是临时代码而不是最终代码。我添加了一个 else 语句,它不再使应用程序崩溃,但它仍然抛出相同的错误。
      【解决方案5】:

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

      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
      

      希望对大家有所帮助

      【讨论】:

        【解决方案6】:

        我也遇到了这个问题,查了一下音频文件的url,发现是存放在Cache目录下的。所以音频播放器可能无法根据您的“url”找到音频文件。

        请确保 url 路径在 Document 目录下。

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            相关资源
            最近更新 更多