我正在使用AVQueuePlayer来播放几个视频,在iOS 6和7中工作正常。但是,在iOS 8中,当当前的AVPlayerItem播放完毕后,下一个视频不会被播放。在队列的currentItem属性上放置观察者显示队列已将下一个视频设置为其当前项目,但它只是不播放(即使进行了显式的播放调用)。
有人了解可能发生了什么以及如何修复它吗?其他人是否遇到过这个问题?
有人了解可能发生了什么以及如何修复它吗?其他人是否遇到过这个问题?
@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");
}
}
}
我曾经遇到过同样的问题。经过几个小时的尝试,我发现如果队列中的某些项目具有不同的加密方法,播放器会停止。
例如,如果播放器刚刚完成了一个加密流的播放,而队列中的下一个项目是未加密的,则播放器将无法继续播放下一个项目。
avplayer 应该始终在主线程上访问。这对于 iOS8 来说并不是什么新鲜事,但也许苹果改变了线程的使用方式,所以你可能比在 iOS7 中更经常地看到这个问题。
为确保在播放状态发生动态变化时安全地访问播放器的非原子属性,您必须使用接收器的通知队列序列化访问。在常见情况下,通过在主线程或队列上调用 AVPlayer 的各种方法自然实现了这种序列化。