4

请有人告诉我是否有一种方法可以选择性地预缓冲AVQueuePlayer数组中的 avplayeritems,而不是将其保留AVQueuePlayer为仅在第一个项目完成播放时才加载下一个项目的自动方式。 

我正在加载一系列 4 个短片剪辑,我想在告诉AVQueuePlayer播放数组之前预先缓存它们。实际上有没有一种方法可以深入 avqueueplayer 并根据需要控制预缓冲?

现在,凭借其默认的延迟加载行为,我在播放中遇到了一些问题,剪辑甚至无法正常播放,因为它AVQueuePlayer正在尝试在播放时加载下一个剪辑。我在部署到实际设备的 iPad 上执行此操作,而不是使用模拟器。

您可以通过调用 mpmovieplayer 来执行此操作,[player prepareToPlay];它基本上手动启动您想要的每个视频文件的加载,然后您可以通过观察mpmovieplayerLoadstateDidChange通知并测试loadState值以查看它是否已完全加载来检查加载是否完成,然后告诉mpmovieplayer 播放。你怎么能有效地做类似的事情AVQueuePlayer呢?

这甚至是可能的还是我发现了它的主要缺点之一AVQueuePlayer


斯蒂芬的好建议playerObserver,但需要的是你需要能够明确地将单个项目加载到内存中,然后告诉AVQueuePlayer'不要播放数组中的第一个项目,直到数组中的所有项目都加载到memory' 目前似乎没有办法开始加载数组中的第二个项目,直到第一个项目即将结束!

作为一个稍微独立的问题,我还注意到AVQueuePlayer,如果AVPlayerItems在播放数组一直播放,剪辑第一次播放正常,但是当再次播放同一剪辑(作为单独的AVPlayerItem)时,它会非常快速地播放,直到视频中的某个点最后开始以正常速度播放从那里。

有没有其他人注意到这种行为?

4

2 回答 2

6

Apple 开发人员支持刚刚向我确认 AVQueuePlayer 不缓冲视频项目。

于 2013-04-10T19:42:24.637 回答
-3

我也有同样的问题。我希望 AV Foundation 有资产满载通知之类的东西。

以下代码可能部分解决问题:

Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:secondThird], nil];

self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
}];
于 2011-09-21T10:43:02.660 回答