2011-08-26 71 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,因爲事情進入不一致的狀態