我有一个视频播放器需要播放来自网络的一系列视频。这些视频的URL不是事先知道的,因为它们来自其他HTTP请求的XML或JSON响应。
视频网址已知时,我会创建AVPlayerItems
并将其添加到AVQueuePlayer
。我观察玩家状态和项目状态以确定正在播放的项目等。
问题在于玩家似乎进入了各种奇怪的状态,并返回AVFoundationErrorDomain error -11800
,从那时起玩家就拒绝玩任何东西。即使在取消分配AVQueuePlayer
并开始新视频之后,之前播放的视频仍然拒绝播放。
将新AVPlayerItems
添加到正在播放AVQueuePlayer
支持的操作中,还是应该以另一种方式执行此操作?如果它受支持,我应该注意/做什么(例如。线程问题?KVO问题?)以使其工作?
答案 0 :(得分:6)
答案是肯定的,AVQueuePlayer
确实可以异步添加AVPlayerItems
。重要的部分在文档中:
AVPlayer序列化在调度队列中回放期间动态发生的更改的通知。默认情况下,此队列是主队列(请参阅dispatch_get_main_queue)。为了确保在报告播放状态的动态变化时安全访问播放器的非原子属性,您必须使用接收器的通知队列序列化访问。在通常情况下,通过在主线程或队列上调用AVPlayer的各种方法,可以自然地实现这种序列化。
由于KVO观察者可能会触发其他线程,因此从主线程调用AVPlayer
(和AVQueuePlayer
)上的所有方法至关重要。
如果你不这样做,你会看到奇怪的行为,AVFoundationErrorDomain -11800
因为事情进入不一致的状态