预加载AVPlayer流媒体视频

8
我正在尝试使用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,并听到了我“真实”视频的音轨。
我在SO上搜索了很多,似乎没有一种方法可以无延迟地播放流视频。希望我错了。

请参考这个答案:https://dev59.com/1m855IYBdhLWcg3wp2J0#39036307 或许对你有帮助。 - iPatel
1个回答

17

您可能无需使用AVQueuePlayer即可完成此操作。

  • 尽早使用远程资源创建AVPlayer。
  • 观察AVPlayerItem(播放缓冲等)以确保它已缓冲足够的数据,以使开头的播放流畅。(参见:预加载视频以消除延迟
  • 显示进度屏幕。
  • 当播放器准备好时,移除进度屏幕。

根据网络连接的情况,您可能无法全程流畅播放,但监视播放器项应该可以让您在播放器正在缓冲时显示一些UI。


嗯,这将涉及我们的进度屏幕和播放屏幕交互方式的轻微重构。(一个推动另一个,但这可能值得一试。)此外,一旦playbackLikelyToKeepUp为true,我可以将AVPlayer保持为单例并将其传递到新窗口中。 - Paul Cezanne
1
给你的可爱回答点个赞。你能否在这里发布示例代码呢?那将非常有帮助。 - Abdul Yasin
请参考这个答案。https://dev59.com/1m855IYBdhLWcg3wp2J0#39036307 或许对你有帮助。 - iPatel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接