预加载AVPlayer流视频

保罗·塞尚

我正在尝试使用AVPlayer播放流视频而没有任何网络延迟。幸运的是,我们的应用在播放视频的屏幕之前有一个进度屏幕。我希望在此进度屏幕上花费一些时间来预加载视频,以便在下一个屏幕上立即播放。

我想出的最有前途的方法是使用AVQueuePlayer播放2个视频,第一个是我在屏幕外播放的视频(因此您看不到)并且没有声音,因此您不会听到。根据我在SO上阅读的内容,当第n个视频即将完成时,AVQueuePlayer会缓冲第n + 1个视频。

这是我执行此操作的代码:

    NSString *blackVideoPath = [[NSBundle mainBundle] pathForResource:@"black10-counting" ofType:@"MOV"];
    AVPlayerItem *blackVideoItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:blackVideoPath]];

    AVPlayerItem *realVideoItem = [AVPlayerItem playerItemWithURL:_videoWithEffectsURL];

    NSArray *theItems = [NSArray arrayWithObjects:blackVideoItem, realVideoItem, nil];
    AVQueuePlayer *theQueuePlayer = [AVQueuePlayer queuePlayerWithItems:theItems];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:[theItems firstObject]];


    AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:theQueuePlayer];

    playerLayer.frame = self.view.bounds;
    [self.view.layer addSublayer:playerLayer];

    [theQueuePlayer play];

这确实播放了我的第一个视频(用于调试,我有一个带有计数声轨的视频),但是到达结尾并前进到下一个屏幕(在playerItemDidReachEnd中)时,我的真实视频不会立即播放。

为了确保我的URL正确,我将列表中的blackVideoItem和realVideoItem颠倒了,我确实听到了我的“真实”视频的配乐。

我已经搜索了很多东西,似乎没有一种方法可以无延迟地播放流视频。我想错了。

l

您可以在没有AVQueuePlayer的情况下执行此操作。

  • 尽早使用远程资产创建AVPlayer。
  • 观察AVPlayerItem(播放缓冲区等),以确保它已缓冲足够的数据以在开始时平稳播放。(请参阅:预加载视频以立即播放
  • 显示进度屏幕。
  • 当播放器项目准备就绪时,删除进度屏幕

根据网络连接的不同,您可能无法在整个播放过程中流畅播放,但是如果播放器正在缓冲,则监视播放器项应该可以显示一些UI。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章