我正在使用AVQueuePlayer播放一些视频,一切都在iOS 6& 7.但是,在iOS 8中,当前AVPlayerItem完成播放时,下一个视频无法播放。将观察者放置在队列的currentItem属性上会显示队列将下一个视频集作为其当前项目按预期进行,它只是不播放(即使使用显式播放调用)。
有没有人能够了解可能发生的事情以及如何解决这个问题?还有其他人遇到过这个问题吗?
答案 0 :(得分: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];
});
}
所以它的工作,但我真的不明白为什么......所以,如果有人有答案......
但是如果这对您不起作用,请尝试将观察者添加到您的播放器(和/或您的playerItem)。您可以添加这样的观察者:
[_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");
}
}
}
让我知道这是否适合您。
答案 1 :(得分:0)
应始终在主线程上访问avplayer。这对于iOS8来说并不是什么新鲜事,但也许Apple改变了线程的使用方式,因此您比iOS7更频繁地看到这个问题。
为了确保在报告播放状态的动态更改时安全访问播放器的非原子属性,您必须使用接收方的通知队列序列化访问。在通常情况下,通过在主线程或队列上调用AVPlayer的各种方法,自然可以实现这种序列化。
答案 2 :(得分:0)
我遇到了同样的问题。经过几个小时的试用,我发现如果队列中的某些项目有不同的加密方法,播放器就会停止。
例如,如果播放器刚刚播放完加密的流,并且队列中的下一个项目未加密,则播放器不会转到下一个项目。