AVQueuePlayer在iOS 8中无法播放下一个项目

3
我正在使用AVQueuePlayer来播放几个视频,在iOS 6和7中工作正常。但是,在iOS 8中,当当前的AVPlayerItem播放完毕后,下一个视频不会被播放。在队列的currentItem属性上放置观察者显示队列已将下一个视频设置为其当前项目,但它只是不播放(即使进行了显式的播放调用)。
有人了解可能发生了什么以及如何修复它吗?其他人是否遇到过这个问题?

这里有完全相同的问题,但仅涉及音频。我不知道我错过了什么... - sexyslippers69
+1,我偶尔会看到这个问题(似乎只在HTTP Live Streaming项目中出现),现有的答案对我似乎不适用。当然,我只从主线程操作AVQueuePlayer。 - Andrey Tarantsov
3个回答

1
我有同样的问题,我在这上面浪费了十个小时... 但是现在通过将“insertItem”方法添加到主线程中已经解决了。所以我的播放器现在是一个属性:
@property AVQueuePlayer * player;

我只是这样初始化它:
_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

我曾经遇到过同样的问题。经过几个小时的尝试,我发现如果队列中的某些项目具有不同的加密方法,播放器会停止。

例如,如果播放器刚刚完成了一个加密流的播放,而队列中的下一个项目是未加密的,则播放器将无法继续播放下一个项目。


0

avplayer 应该始终在主线程上访问。这对于 iOS8 来说并不是什么新鲜事,但也许苹果改变了线程的使用方式,所以你可能比在 iOS7 中更经常地看到这个问题。

为确保在播放状态发生动态变化时安全地访问播放器的非原子属性,您必须使用接收器的通知队列序列化访问。在常见情况下,通过在主线程或队列上调用 AVPlayer 的各种方法自然实现了这种序列化。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接