关于视频预加载有很多关于SO的主题,但对我来说仍然不是很清楚。
目的:
理想情况下,计算下载速度,预测f.e缓冲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]);
}
});
}];
}
视频开始播放且连接速度很慢,但如果我们开始播放,请在1分钟后说出来,播放效果很好。
主要问题 - 是否能够在不延迟的情况下开始播放直到结束时获得通知?
注意:它是否为AVFoundation or MPMovieController
我认为只能通过单独下载视频,在本地存储然后播放来完成。那里有负面影响 - 我们无法开始播放,直到整个文件被下载。
答案 0 :(得分:4)
您可以在AVPlayerItem的playbackLikelyToKeepUp,playbackBufferEmpty和playbackBufferFull属性上进行键值观察,以了解您的播放器状态。有关docs中这些值何时为真的更详细信息,请参阅。值得注意的是:
当属性playbackBufferFull指示YES时,playbackLikelyToKeepUp可以指示NO。在这种情况下,回放缓冲区已达到容量,但没有统计数据支持预测回放可能在未来保持。您可以决定是否继续播放媒体。