预加载视频以立即播放

Inj*_*ios 4 avfoundation ios

关于视频预加载的主题有很多,但对我来说仍然不太清楚。

目标:

  1. 从网络加载视频,给出URL
  2. 等待视频完全加载
  3. 无延迟地播放视频(正如我所说,它已经 100% 缓冲)

理想情况下,计算下载速度,预测缓冲 60% 视频时的 fe,我们开始播放,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]);
                            }
                        });
     }];
}
Run Code Online (Sandbox Code Playgroud)

视频开始播放,在连接速度较慢时会挂起,但如果我们开始播放,假设 1 分钟后,它会播放得很好。

主要问题 - 是否能够在比赛开始时收到通知,并在不延迟的情况下一直比赛到结束?

注意:是否是一个并不重要AVFoundation or MPMovieController

我假设这只能通过单独下载视频,将其存储在本地然后播放来完成。不利的方面是 - 在下载整个文件之前我们无法开始播放。

jlw*_*jlw 5

您可以对 AVPlayerItem 的playbackLikelyToKeepUp、playbackBufferEmpty 和playbackBufferFull 属性进行键值观察,以了解播放器的状态。在文档中查看有关这些值何时为真的更详细信息。尤其:

playbackLikelyToKeepUp 可能指示“NO”,而属性playbackBufferFull 指示“YES”。在这种情况下,播放缓冲区已达到容量,但没有统计数据来支持未来播放可能保持的预测。由您决定是否继续媒体播放。

  • 请在此处发布示例代码。这会有很大的帮助。 (3认同)