У меня была точно такая же проблема, и я потратил десять часов на это ...
Но теперь это исправлено, добавив метод «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");
}
}
}
Позвольте мне знать, если эта работа для вас.
Точно такая же проблема здесь, но только с аудио. Я не знаю, чего мне не хватает ... – audric
+1, видя это эпизодически (по-видимому, довольно редко и только с HTTP-потоковыми вещами), существующие ответы мне не подходят. И, конечно же, я манипулирую AVQueuePlayer только из основного потока. –