AVPlayer没有readyForDisplay,没有显示

时间:2011-10-25 17:38:47

标签: ios avplayer

我无法理解在什么条件下AVPlayer readyForDisplay对于本地存储的视频剪辑会是“YES”。我正在构建一个应用程序,其主视图有两个子视图,每个子视图都是UIView的自定义子类,包含一个AVPlayer和一个显示视频的APPlayerLayer。应用程序在显示这两个子视图之间切换以响应用户输入。在我的主视图控制器中,我有这样的事情:

- (void)viewDidLoad
{
    firstView = [VideoView alloc] initWithFileName:@"clip1.mov"]];  //  VideoViews are assigend to instance variables
     secondView = [VideoView alloc] initWithFileName:@"clip2.mov"]];
    [[self view] addSubview:firstView];
}

这些视图的初始化会加载AVPlayer并创建一个AVPlayerLayer。启动应用程序后,第一个剪辑会正确显示。响应用户输入,第二个视频显示在第一个视频的位置,如下所示:

- (void)responseToEvent
{
    NSLog(@"%i", [targetView.readyForDisplay]); // prints out "1" in the console
    [firstView removeFromSuperview];
    [self.view addSubview:secondView];
}

这很好用。但是,如果我更改viewDidLoad以将secondView放入NSMutableDictionary中,如下所示:

- (void)viewDidLoad
{
    firstView = [VideoView alloc] initWithFileName:@"clip1.mov"]];
    VideoView *secondView = [VideoView alloc] initWithFileName:@"clip2.mov"]];
    [someViews setObject: secondView forKey:viewIndex];
    [[self view] addSubview: firstView];
}

...然后稍后从某些视图中获取视图:

- (void)responseToEvent
{
    VideoView *secondView = [neighborViews objectForKey:link.targetView.pftViewId];
    NSLog(@"%i", [targetView.readyForDisplay]); // prints out "0" in the console
    [firstView removeFromSuperview];
    [self.view addSubview:secondView];
}

......这不起作用。没有显示视频。我无法理解为什么将包含视图放入NSMutableDictionary会导致AVPlayer没有准备好并且不显示视频。此外,视频永远不会出现(它永远不会变成“准备好”)。有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:0)

使用键值观察器来监听状态的变化:

[self.playerLayer addObserver:self forKeyPath:@"readyForDisplay" options:0 context:NULL];

然后在同一个类中添加:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                    change:(NSDictionary *)change context:(void *)context {

 if ([keyPath isEqualToString:@"readyForDisplay"]) {

确保删除最后的观察者