2014-11-07 2 views
3

Я использую AVQueuePlayer для воспроизведения нескольких видеороликов, все отлично работает в iOS 6 & 7. Однако в iOS 8, когда текущий AVPlayerItem заканчивает воспроизведение следующего видео, он не воспроизводится. Помещение наблюдателя в свойство currentItem очереди показывает, что очередь имеет следующий видеоролик как текущий элемент, как и ожидалось, он просто не играет (даже при явных вызовах воспроизведения).AVQueuePlayer не переходит к следующему элементу в iOS 8

Есть ли у кого-нибудь представление о том, что может произойти и как это исправить? Кто-нибудь еще сталкивается с этой проблемой?

+0

Точно такая же проблема здесь, но только с аудио. Я не знаю, чего мне не хватает ... – audric

+0

+1, видя это эпизодически (по-видимому, довольно редко и только с HTTP-потоковыми вещами), существующие ответы мне не подходят. И, конечно же, я манипулирую AVQueuePlayer только из основного потока. –

ответ

1

У меня была точно такая же проблема, и я потратил десять часов на это ...
Но теперь это исправлено, добавив метод «insertItem» в основной поток.

Так что у меня плеер как свойство:

@property AVQueuePlayer * player; 

Я просто INIT это следующим образом:

_player = [[AVQueuePlayer alloc] init]; 

А вот мой метод, чтобы добавить элементы из пути:

- (void)addInQueuePlayerFile:(NSString *)path { 
    AVAsset * asset = [AVAsset assetWithURL:[[NSURL alloc] initFileURLWithPath:path]]; 
    AVPlayerItem * playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [_player insertItem:playerItem afterItem:nil]; 
    }); 
} 

Так что это работает, но я действительно не понимаю, почему ... Так что если у кого-то есть ответ ...

Но если это не сработает для вас, попробуйте добавить наблюдателя к игроку (и/или вашему игровому элементу). Вы можете добавить наблюдатель так:

[_player addObserver:self forKeyPath:@"status" options:0 context:nil] 

И поймать его с помощью этого метода:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (object == _player && [keyPath isEqualToString:@"status"]) { 
     if (_player.status == AVPlayerStatusFailed) { 
     NSLog(@"AVPlayer Failed"); 
     } else if (_player.status == AVPlayerStatusReadyToPlay) { 
     NSLog(@"AVPlayer item Ready to Play"); 
     } else if (_player.status == AVPlayerStatusUnknown) { 
     NSLog(@"AVPlayer item Unknown"); 
     } 
    } 
} 

Позвольте мне знать, если эта работа для вас.

0

AV-плеер должен всегда иметь доступ к основной нити. Это ничего нового для iOS8, но, возможно, Apple изменила использование потоков, так что вы видите проблему чаще, чем в iOS7.

Для обеспечения безопасного доступа к неатомическим свойствам плеера, в то время как динамические изменения состояния воспроизведения могут сообщаться, вы должны сериализовать доступ в очереди уведомлений получателя. В общем случае такая сериализация естественно достигается путем вызова различных методов AVPlayer в основном потоке или очереди.

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html

0

У меня была такая же проблема. После нескольких часов судебного разбирательства я обнаружил, что если некоторые из элементов в очереди имеют разные методы шифрования, игрок остановится.

Например, если игрок только что закончил играть зашифрованный поток, а следующий элемент в очереди был незашифрован, игрок не будет переходить к следующему элементу.

Смежные вопросы