首页 文章

控制avqueueplayer中项目的预缓冲

提问于
浏览
4

请有人告诉我是否有办法有选择地预缓冲 AVQueuePlayer 数组中的avplayeritems,而不是将其留下 AVQueuePlayer 自动方式,只在第一项完成播放时加载下一项 .

我想在告诉 AVQueuePlayer 播放数组之前预先缓存它们 . 实际上有一种方法可以获得avqueueplayer的bonet并根据需要控制预缓冲吗?

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

你可以通过调用 [player prepareToPlay]; 基本上手动启动所需的每个视频文件的加载与mpmovieplayer做到这一点,那么你可以留意 mpmovieplayerLoadstateDidChange 通知和测试 loadState Value ,看它是否有满载检查装载completeion ,然后告诉mpmovieplayer玩 . 你怎么能用 AVQueuePlayer 有效地做同样的事情?

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


很好的建议与 playerObserver 斯蒂芬,但需要的是你需要能够显式获取单个项目加载到内存然后告诉 AVQueuePlayer 'do not play the first item in the array until ALL items in the array are loaded into memory'目前似乎没有办法启动数组中的第二项加载直到第一个即将结束!

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

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

2 回答

  • -2

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

  • 6

    我也有同样的问题 . 我希望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:^{
    }];
    

相关问题