2011-08-26 57 views
2

我有一台需要播放网络视频序列的视频播放器。这些视频的URL并不是事先知道的,因为它们来自其他HTTP请求的XML或JSON响应。AVQueuePlayer是否支持异步添加AVPlayerItems?

当视频网址变得已知时,我创建了AVPlayerItems并将它们添加到AVQueuePlayer。我观察玩家状态和物品状态,以确定哪个物品正在播放等。

问题是,玩家似乎进入各种奇怪的状态,它返回AVFoundationErrorDomain error -11800,从此玩家拒绝玩任何东西。即使在取消分配AVQueuePlayer并开始新分配之后,以前播放的视频也会拒绝播放。

是否正在添加新的AVPlayerItems以支持正在播放的AVQueuePlayer操作,还是应该以另一种方式进行操作?如果支持,我应该寻找什么(例如,线程问题?KVO问题?)以使其工作?

回答

6

答案是肯定的,AVQueuePlayer可以异步添加AVPlayerItems。重要的部分在文档中:

AVPlayer序列化在分发队列上播放期间动态发生的更改的通知。默认情况下,此队列是主队列(请参阅dispatch_get_main_queue)。为了确保安全地访问玩家的非原子属性,同时可以报告播放状态的动态变化,您必须使用接收者的通知队列序列化访问。在常见情况下,通过在主线程或队列中调用AVPlayer的各种方法自然可以实现这种序列化。

由于志愿观察家可能会触发其他线程上,它的关键在主线程中调用上AVPlayer(和AVQueuePlayer)的所有方法。

如果你不这样做,你会看到奇怪的行为和AVFoundationErrorDomain -11800,因为事情进入不一致的状态