控制avqueueplayer中项目的预缓冲

时间:2011-09-12 08:41:44

标签: ios ipad avfoundation avplayer avqueueplayer

有人可以告诉我是否有办法有选择地预先缓冲AVQueuePlayer数组中的avplayeritems,而不是将其留下AVQueuePlayer自动加载下一个项目的方式第一项完成比赛。

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

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

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

这是可能的还是我发现AVQueuePlayer的主要缺点之一?


playerObserver Stephen提出了很好的建议,但是需要的是你需要能够明确地将单个项目加载到内存中然后告诉AVQueuePlayer'不要播放第一个数组中的项,直到数组中的所有项都被加载到内存中“当前似乎没有办法启动数组加载中的第二项,直到第一项结束!”

作为一个稍微独立的问题,我还注意到AVQueuePlayer中的一些奇怪现象,如果你将两个相同的源视频文件加载到数组中(两者都被引用为两个完全独立的AVPlayerItems你应该这样做)当你一直播放数组中的视频片段时,第一次剪辑播放ok,但是当再次播放相同的片段时(作为一个单独的AVPlayerItem),它会播放 - 通过很快,直到视频中的某一点,然后终于从那里以正常速度开始播放。

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

2 个答案:

答案 0 :(得分:6)

Apple Developer Support刚刚向我确认AVQueuePlayer不会缓冲视频项目。

答案 1 :(得分:-2)

我有同样的问题。我希望AV基金会有资产满载通知。

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

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:^{
}];