关于视频预加载的主题在SO上有很多,但对我来说仍然不是非常清晰。
目标:
- 从网络中加载视频,URL已给出
- 等待视频完全加载完成
- 没有延迟地播放视频(就像我说的那样,已经缓冲了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。我认为唯一的方法是单独下载视频,本地存储,然后再播放。负面影响是必须等待整个文件下载完毕才能开始播放。