2014-05-24 1 views
10

Parfois AVPlayer échoue avec AVPlayerItemStatusFailed et après que cette erreur s'est produite, AVPlayer continue d'échouer avec AVPlayerItemStatusFailed. J'ai essayé d'effacer l'instance d'AVPlayer et en créer une nouvelle, mais je ne peux pas obtenir l'erreur AVPlayerItemStatusFailed à résoudre. En outre, removingFromSuperviewUIView avec l'instance AVPlayer et l'initialisation d'un nouvel élément avec AVPlayer ne résout pas le problème.AVPlayer échoue avec AVPlayerItemStatusFailed (OSStatus error -12983)

J'ai donc pensé qu'AVPlayer ne pouvait pas être complètement effacé. Quelqu'un suggère-t-il quelque chose à essayer pour effacer AVPlayer complètement et le faire fonctionner après l'échec?

journal d'erreur:

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. Pour @ 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

Afficher le code _your_ - le code que vous utilisez pour essayer de jouer en premier lieu. – matt

+0

@matt Merci pour votre réponse, j'ai ajouté mon code ci-dessus. – instback

+0

Une chance que 'filePath.path' soit mauvaise? Peut-être sortirait-il? – matt

Répondre

7

Le problème est que cette ligne est inconditionnelle:

[self.layer addSublayer:avPlayerLayer]; 

Ainsi vous ajoutez une nouvelle couche de joueur à chaque fois. Ainsi, vous empilez plusieurs couches de joueurs. C'est faux. Il doit y en avoir un seul. Gardez une référence à l'ancien calque du joueur et retirez-le avant d'ajouter un calque de joueur, ou, si c'est le même joueur qu'avant et qu'il a déjà la couche de joueur associée dans l'interface, ne faites rien.

+0

Merci! Fixé! – instback

+0

Assurez-vous également que vous ne retenez aucun objet de AVPlayer, AVPlayerLayer ou AVPlayerItem. Dans mon cas, j'utilisais [player addPeriodicTimeObserverForInterval:] pour obtenir des intervalles périodiques. il conservait AVPlayer. A la place, j'ai utilisé un NSTimer et l'ai invalidé quand nécessaire. –

+0

J'utilise un point d'arrêt symbolique pour m'assurer que AVPlayer est désalloué correctement, et j'utilise seulement 1 instance d'AVPlayerLayer, mais cette erreur survient parfois (iOS 8 a un bug qui ne reprend pas le lecteur , donc je dois redémarrer le lecteur), pourquoi est-ce – onmyway133

0

Créer une instance partagée de AVPlayer avec playerItem = nil. La prochaine fois seulement remplacerThePlayerItem.

0

Il est parfois arrivé dans le simulateur iOS,
essayer de redémarrer le simulateur à nouveau peut fonctionner. :)