预加载AVPlayer流媒体视频

时间:2014-10-16 20:29:40

标签: ios avplayer avqueueplayer

我正在尝试使用AVPlayer播放流媒体视频而不会出现任何网络延迟。幸运的是,我们的应用程序在播放视频的屏幕之前有一个进度屏幕。我希望在这个进度屏幕上使用一些时间来预加载视频,以便在下一个屏幕上无延迟地播放。

我提出的最有前途的方法是使用AVQueuePlayer播放2个视频,第一个是我在屏幕上播放的视频(所以你看不到它)并且是静音的,所以你听不到从我在SO AVQueuePlayer上看到的内容,当第n个视频接近完成时,缓冲第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中)我的真实视频不能立即播放。

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

我搜索了很多内容,似乎没有办法毫不拖延地播放流媒体视频。我喜欢错了。

1 个答案:

答案 0 :(得分:15)

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

  • 尽早使用远程资产创建AVPlayer。
  • 观察AVPlayerItem(播放缓冲区等)以确保它已缓冲足够的数据以便在开始时流畅播放。 (见:Preloading video to play without delay
  • 显示进度屏幕。
  • 播放器项目准备就绪后,删除进度屏幕

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