预加载视频以避免延迟播放

4

关于视频预加载的主题在SO上有很多,但对我来说仍然不是非常清晰。

目标:

  1. 从网络中加载视频,URL已给出
  2. 等待视频完全加载完成
  3. 没有延迟地播放视频(就像我说的那样,已经缓冲了100%)

理想情况下,计算下载速度,预测例如在缓冲了视频的60%时开始播放,而在不延迟播放的情况下缓冲了40%。

我尝试过的:

 NSURL *url = [NSURL URLWithString:@"video url address here"];
 AVURLAsset *avasset = [[AVURLAsset alloc] initWithURL:url options:nil];

 AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:avasset];
 self.player = [[AVPlayer alloc] initWithPlayerItem:item];

 self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
 CGSize size = self.view.bounds.size;
 float x = size.width/2.0-202.0;
 float y = size.height/2.0 - 100;

 self.playerLayer.frame = CGRectMake(x, y, 404, 200);
 self.playerLayer.backgroundColor = [UIColor blackColor].CGColor;

 [self.view.layer addSublayer:self.playerLayer];
 NSString *tracksKey = @"tracks";

 [avasset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
     ^{
         dispatch_async(dispatch_get_main_queue(),
                        ^{
                            NSError *error = nil;
                            AVKeyValueStatus status = [avasset statusOfValueForKey:tracksKey error:&error];
                                NSLog(@"Status %d", status);
                            if (status == AVKeyValueStatusLoaded) {
                                [self.player play];
                            }
                            else {
                                NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
                            }
                        });
     }];
}

视频开始播放后,如果网络连接较慢会卡顿,但如果我们在一分钟后开始播放,它会流畅地播放。主要问题是,是否有能力在可以立即开始并不延迟的情况下得到通知并播放到结束?注意:这并不重要是AVFoundation还是MPMovieController。我认为唯一的方法是单独下载视频,本地存储,然后再播放。负面影响是必须等待整个文件下载完毕才能开始播放。

可能是http://stackoverflow.com/questions/24030003/show-progress-bar-until-video-loads-ios7/24036738#24036738的重复问题。 - karthikeyan
你是怎么解决这个问题的?我也遇到了同样的问题。 - user2526811
我们下载压缩的视频文件并在本地播放。 - Injectios
1个回答

5
你可以在AVPlayerItem的playbackLikelyToKeepUp、playbackBufferEmpty和playbackBufferFull属性上进行键值观察,以了解播放器的状态。有关这些值何时为真的更细节的信息,请参见docs。值得注意的是:
当playbackLikelyToKeepUp指示为NO而playbackBufferFull指示为YES时,播放缓冲区已达到容量,但没有统计数据支持未来播放可能跟上的预测。由您决定是否继续媒体播放。

3
请在此处发布示例代码。这将非常有帮助。 - Abdul Yasin

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