我正在使用 AVQueuePlayer 播放一些视频,在 iOS 6 和 7 中一切正常。但是,在 iOS 8 中,当前 AVPlayerItem 播放完下一个视频时不会播放。在队列的 currentItem 属性上放置一个观察者表明队列将下一个视频设置为其当前项目,正如预期的那样,它只是不播放(即使有明确的播放调用)。
有没有人对可能发生的事情以及如何解决它有任何见解?有没有其他人遇到过这个问题?
我正在使用 AVQueuePlayer 播放一些视频,在 iOS 6 和 7 中一切正常。但是,在 iOS 8 中,当前 AVPlayerItem 播放完下一个视频时不会播放。在队列的 currentItem 属性上放置一个观察者表明队列将下一个视频设置为其当前项目,正如预期的那样,它只是不播放(即使有明确的播放调用)。
有没有人对可能发生的事情以及如何解决它有任何见解?有没有其他人遇到过这个问题?
我遇到了完全相同的问题,我为此浪费了十个小时......
但现在通过将“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");
}
}
}
让我知道这是否适合您。
avplayer 应始终在主线程上访问。这对 iOS8 来说并不是什么新鲜事,但也许 Apple 改变了线程的使用方式,因此您比在 iOS7 中更频繁地看到这个问题。
为了确保在可能报告播放状态的动态变化时安全访问播放器的非原子属性,您必须使用接收器的通知队列序列化访问。一般情况下,这样的序列化自然是通过在主线程或者队列上调用AVPlayer的各种方法来实现的。
我有同样的问题。经过几个小时的试用,我发现如果队列中的某些项目有不同的加密方法,播放器就会卡住。
例如,如果播放器刚刚播放完加密流,而队列中的下一个项目未加密,则播放器不会继续播放下一个项目。