OSStatus error 2003334207 when using AVAudioPlayer

19,961

Solution 1

It looks like your trying to unwrap a variable that has a nil value. You should safely unwrap your variables to prevent this.

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
}

You will still need to figure out why it is returning nil but this is a safer way to unwrap variables and prevent crashing as there would need to be more context to resolve that issue.

Some questions to look into:

  • Are you sure the fetchedResultsController is returning an object at all?
  • Are you sure it is of CDEpisode?

Solution 2

This is probably caused by trying to load a file that doesn't exist. If that helps someone adding the call to url.checkResourceIsReachable() will log more descriptive message.

Example code:

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

Solution 3

try this one

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

Solution 4

You're checking if audioPlayer is nil but then you go on to use it as if it wasn't anyway. You probably want something like:

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

And do something to actually handle the error case rather than just printing the error.

Share:
19,961

Related videos on Youtube

user2747220
Author by

user2747220

Updated on June 18, 2022

Comments

  • user2747220
    user2747220 almost 2 years

    I am trying to play an MP3 file (works when played via VLC/iTunes) when a button is pressed. Here is my code:

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

    Here is the log:

    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
    

    The EXC_BREAKPOINT happens on the audioPlayer.delegate = self.

    Other threads on StackoOverflow do not help. Any ideas? Thanks

    Edit: I have tried passing a localURL to contentsOfURL (instead of a CDEpisode object) and it still fails.

  • user2747220
    user2747220 about 9 years
    You're absolutely correct. This is just makeshift code and not final. I've added an else statement and it doesn't crash the app anymore but it still throws the same error.
  • user2747220
    user2747220 about 9 years
    Thanks, you are right. The app still throws the same error. the fetchedResultsController returns the right object of type CDEpisode.
  • user2747220
    user2747220 about 9 years
    There was a mistake in my CoreData database. This is now fixed. Thanks to you and @dan