2014-05-24 4 views
10

Manchmal schlägt der AVPlayer mit AVPlayerItemStatusFailed fehl und nachdem dieser Fehler aufgetreten ist, schlägt AVPlayer weiterhin mit AVPlayerItemStatusFailed fehl. Ich habe versucht, die AVPlayer-Instanz zu löschen und eine neue zu erstellen, aber ich kann AVPlayerItemStatusFailed Fehler nicht lösen. Auch removingFromSuperviewUIView mit AVPlayer-Instanz und Initialisierung eines neuen Elements mit AVPlayer löst das Problem nicht.AVPlayer schlägt mit AVPlayerItemStatusFailed fehl (OSStatus-Fehler -12983)

Also ich dachte, dass AVPlayer nicht vollständig gelöscht werden konnte. Gibt es irgendjemanden, der etwas vorschlagen könnte, um den AVPlayer vollständig zu löschen und nach einem Fehlschlag arbeiten zu lassen?

Fehlerprotokoll:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x1a689360 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x1a688e70 "The operation couldn’t be completed. (OSStatus error -12983.)", NSLocalizedFailureReason=An unknown error occurred (-12983)} 

UPD. Für @ Matt

playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:filePath.path]]; 

if (!self.avPlayer) { 
    avPlayer = [AVPlayer playerWithPlayerItem:playerItem]; 
} 

[avPlayer.currentItem addObserver:self forKeyPath:@"status" options:0 context:nil]; 

if (self.avPlayer.currentItem != self.playerItem) { 
    [self.avPlayer replaceCurrentItemWithPlayerItem:playerItem]; 
} 

AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer]; 
avPlayerLayer.frame = self.bounds; 
[self.layer addSublayer:avPlayerLayer]; 

avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

[avPlayer play]; 
+0

Zeigen Sie _your_ code - den Code, den Sie verwenden, um zu versuchen, an erster Stelle zu spielen. – matt

+0

@matt Danke für deine Antwort, ich habe meinen obigen Code hinzugefügt. – instback

+0

Eine Chance, dass 'filePath.path' schlecht ist? Vielleicht nil rauskommen? – matt

Antwort

7

Das Problem ist, dass diese Linie bedingungslos ist:

[self.layer addSublayer:avPlayerLayer]; 

So werden Sie jedes Mal einen neuen Spieler Schicht hinzugefügt wird. So häufst du viele Spielerschichten auf. Das ist falsch. Es muss nur einen geben. Behalte einen Hinweis auf die alte Player-Ebene und entferne sie, bevor du eine Player-Ebene hinzufügst. Wenn dies derselbe Player wie zuvor ist und er bereits die zugehörige Player-Ebene in der Benutzeroberfläche hat, mache nichts.

+0

Danke! Fest! – instback

+0

Stellen Sie außerdem sicher, dass Sie kein Objekt von AVPlayer, AVPlayerLayer oder AVPlayerItem beibehalten. In meinem Fall habe ich [player addPeriodicTimeObserverForInterval:] verwendet, um periodische Intervalle zu erhalten. Es wurde AVPlayer beibehalten. Stattdessen benutzte ich einen NSTimer und invalidierte es bei Bedarf –

+0

Ich benutze symbolischen Haltepunkt, um sicherzustellen, dass AVPlayer ordnungsgemäß freigegeben ist, und ich verwende nur 1 Instanz von AVPlayerLayer, aber dieser Fehler passiert manchmal (iOS 8 hat einen Fehler, dass es Player nicht fortgesetzt , also muss ich den Player neu starten), warum ist das so? – onmyway133

0

Erstellen Sie eine sharedInstance von AVPlayer mit playerItem = nil. Das nächste Mal nur replaceThePlayerItem.

0

Es ist manchmal in iOS-Simulator passiert,
versuchen, Simulator erneut zu starten möglicherweise funktioniert. :)