我正在使用AVQueuePlayer播放一些视频,在iOS 6和7中一切正常 . 但是,在iOS 8中,当前AVPlayerItem完成播放时,下一个视频无法播放 . 将观察者放置在队列的currentItem属性上会显示队列将下一个视频集作为其当前项目按预期进行,它只是不播放(即使使用显式播放调用) .
有没有人能够了解可能发生的事情以及如何解决这个问题?还有其他人遇到过这个问题吗?
我有完全相同的问题,我浪费了十个小时......但现在通过将"insertItem"方法添加到主线程中来修复它 .
所以我把我的玩家作为 property :
@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的各种方法,自然可以实现这种序列化 .
https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html
我有同样的问题 . 经过几个小时的试用,我发现如果队列中的某些项目有不同的加密方法,播放器就会停止 .
例如,如果播放器刚刚播放完加密的流,并且队列中的下一个项目未加密,则播放器不会继续播放下一个项目 .
3 回答
我有完全相同的问题,我浪费了十个小时......
但现在通过将"insertItem"方法添加到主线程中来修复它 .
所以我把我的玩家作为 property :
我只是这样初始化它:
这是我从路径添加项目的方法:
所以它的工作,但我真的不明白为什么......所以,如果有人有答案......
但是如果这对您不起作用,请尝试向您的播放器(和/或您的playerItem)添加观察者 . 您可以添加这样的观察者:
并用这种方法捕捉它:
如果这对您有用,请告诉我 .
应始终在主线程上访问avplayer . 这对iOS8来说并不是什么新鲜事,但也许Apple改变了线程的使用方式,所以你比iOS7更经常地看到这个问题 .
https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayer_Class/index.html
我有同样的问题 . 经过几个小时的试用,我发现如果队列中的某些项目有不同的加密方法,播放器就会停止 .
例如,如果播放器刚刚播放完加密的流,并且队列中的下一个项目未加密,则播放器不会继续播放下一个项目 .