AVPlayer не готов к отображению, не показывает

Мне трудно понять, при каких условиях AVPlayer readyForDisplay будет иметь значение «ДА» для локально сохраненного видеоклипа. Я создаю приложение, основное представление которого имеет два подпредставления, каждое из которых является настраиваемым подклассом 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 не будет готов и не отобразит видео. Кроме того, видео никогда не появляется (оно никогда не становится «готовым»). Кто-нибудь знает, что здесь происходит?


person one09jason    schedule 25.10.2011    source источник


Ответы (1)


Используйте наблюдателей значения ключа для прослушивания изменений в состоянии:

[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"]) {

не забудьте удалить наблюдателя в конце

person yeahdixon    schedule 07.12.2013