2015-03-16 14 views
7

Sto provando a riprodurre un file MP3 (funziona quando viene riprodotto tramite VLC/iTunes) quando si preme un pulsante. Ecco il mio codice:Errore OSStatus 2003334207 quando si utilizza AVAudioPlayer

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

Ecco il 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 

La EXC_BREAKPOINT accade sul audioPlayer.delegate = self.

Altre discussioni su StackoOverflow non aiutano. Qualche idea? Grazie

Modifica: ho provato passando un localURL a contentsOfURL (invece di un oggetto CDEpisode) e non riesce ancora.

+0

ho guardato il codice di errore e 2.003.334,207 mila dà the localizedDescription "L'operazione non può essere completata". Nella mia app stavo cercando di accedere a un file che non esisteva. – Unome

risposta

2

Sembra che tu stia cercando di scartare una variabile che ha un valore nullo. Dovresti scartare le tue variabili in sicurezza per impedirlo.

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 
} 

sarà ancora bisogno di capire il motivo per cui sta tornando pari a zero, ma questo è un modo più sicuro per scartare le variabili e prevenire crash in quanto non vi sarebbe bisogno di essere più contesto per risolvere tale problema.

Alcune domande da esaminare:

  • Sei sicuro il fetchedResultsController restituisce un oggetto in tutti?
  • Sei sicuro che sia di CDEpisode?
+0

Grazie, hai ragione. L'app genera ancora lo stesso errore. il fetchedResultsController restituisce l'oggetto giusto di tipo CDEpisode. – user2747220

+0

C'è stato un errore nel mio database CoreData. Questo è ora risolto. Grazie a te e @dan – user2747220

2

si sta controllando se è audioPlayernil ma poi si va su di usarlo come se non fosse in ogni caso. Probabilmente vuoi qualcosa del tipo:

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

E fare qualcosa per gestire effettivamente il caso di errore piuttosto che semplicemente stampare l'errore.

+0

Hai assolutamente ragione. Questo è solo un codice di fortuna e non definitivo. Ho aggiunto un'altra istruzione e non blocca più l'app, ma genera ancora lo stesso errore. – user2747220

0

Nel mio caso ho avuto lo stesso problema e ho scoperto che avevo bisogno di impostare questo prima avviare la registrazione

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 

Speranza che aiuta chiunque

Problemi correlati