web-dev-qa-db-ja.com

AVAudioPlayer使用時のOSStatusエラー2003334207

ボタンが押されたときに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_BREAKPOINTaudioPlayer.delegate = selfで発生します。

StackoOverflowの他のスレッドは役に立ちません。何か案は?ありがとう

編集 :( CDEpisodeオブジェクトの代わりに)localURLをcontentsOfURLに渡そうとしましたが、それでも失敗します。

11
user2747220

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のものでよろしいですか?
5
chrissukhram

audioPlayernilであるかどうかを確認していますが、それでもそうではないかのように使用し続けます。あなたはおそらく次のようなものが欲しいでしょう:

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

そして、単にエラーを出力するのではなく、実際にエラーケースを処理するために何かをします。

4
dan

これは、存在しないファイルを読み込もうとしたことが原因である可能性があります。それが誰かが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)")
    }
2
Dima Gimburg

また、オーディオファイルのURLを確認したところ、キャッシュディレクトリに保存されていることがわかりました。そのため、オーディオプレーヤーはおそらくあなたの「URL」に従ってオーディオファイルを見つけることができませんでした。

uRLパスがドキュメントディレクトリの下にあることを確認してください。

0
Chris Lee

私の場合、同じ問題が発生していて、録音を開始する前にこれを設定する必要があることがわかりました

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

それが誰かに役立つことを願っています

0