预加载视频即可播放

时间:2014-09-25 11:11:27

标签: ios avfoundation

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

目的:

  1. 从网络加载视频,提供网址
  2. 等待视频完全加载
  3. 毫不拖延地播放视频(正如我所说,它已经100%缓存)
  4. 理想情况下,计算下载速度,预测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

    并不重要

    我认为只能通过单独下载视频,在本地存储然后播放来完成。那里有负面影响 - 我们无法开始播放,直到整个文件被下载。

1 个答案:

答案 0 :(得分:4)

您可以在AVPlayerItem的playbackLikelyToKeepUp,playbackBufferEmpty和playbackBufferFull属性上进行键值观察,以了解您的播放器状态。有关docs中这些值何时为真的更详细信息,请参阅。值得注意的是:

  

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