2014-05-24 28 views
10

Czasami gra AVPlayer kończy się niepowodzeniem z AVPlayerItemStatusFailed, a po tym niepowodzeniu AVPlayer nadal kończy się niepowodzeniem z AVPlayerItemStatusFailed. Próbowałem wyczyścić instancję AVPlayera i utworzyć nową, ale nie udało mi się rozwiązać problemu z niepowodzeniem AVPlayerItemStatusFailed. Również removingFromSuperviewUIView z instancją AVPlayer i zainicjowaniem nowego elementu za pomocą AVPlayer nie rozwiązuje problemu.AVPlayer kończy się niepowodzeniem z AVPlayerItemStatusFailed (błąd OSStatus -12983)

Więc doszedłem do wniosku, że AVPlayer nie został całkowicie usunięty. Czy jest ktoś, kto cokolwiek zasugeruje, aby całkowicie usunąć AVPlayer i sprawić, by działał po awarii?

dziennika błędu:

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

Pokaż _Twój kod - kod, którego używasz do gry w pierwszej kolejności. – matt

+0

@matt Dzięki za odpowiedź, dodałem mój kod powyżej. – instback

+0

Czy istnieje szansa, że ​​'filePath.path' będzie złe? Może wyjdzie zero? – matt

Odpowiedz

7

Problem polega na tym, że ta linia jest bezwarunkowe:

[self.layer addSublayer:avPlayerLayer]; 

zatem dodajesz nową warstwę odtwarzacza za każdym razem. W ten sposób układasz wiele warstw gracza. To jest źle. Musi być tylko jeden. Zachowaj odwołanie do starej warstwy odtwarzacza i usuń ją przed dodaniem warstwy gracza lub, jeśli jest to ten sam odtwarzacz co poprzednio i ma już powiązaną warstwę odtwarzacza w interfejsie, nie rób nic.

+0

Dziękujemy! Naprawiony! – instback

+0

Upewnij się również, że nie zatrzymujesz żadnych obiektów ani w AVPlayer, AVPlayerLayer ani AVPlayerItem. W moim przypadku używałem [player addPeriodicTimeObserverForInterval:], aby otrzymywać okresowe interwały. to zachowało AVPlayer. Zamiast tego użyłem NSTimer i unieważniłem je, gdy jest to wymagane. –

+0

Używam symbolicznego punktu przerwania, aby upewnić się, że AVPlayer jest prawidłowo przydzielony, a ja używam tylko 1 wystąpienia AVPlayerLayer, ale ten błąd zdarza się czasem (iOS 8 ma błąd, że nie wznawia odtwarzacza , więc muszę zrestartować odtwarzacz), dlaczego tak jest – onmyway133

0

Utwórz współużytkowaną instancję AVPlayer z playerItem = nil. Następnym razem tylko replaceThePlayerItem.

0

Czasami zdarzyło się, że w symulatorze iOS,
, próba ponownego uruchomienia symulatora może zadziałać. :)