AVPlayer не готов к отображению, не показывает - PullRequest
2 голосов
/ 25 октября 2011

Мне сложно понять, при каких условиях 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];
}

... и затем позже получу представление из некоторых ViewS, как это:

- (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 голосов
/ 07 декабря 2013

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

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

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

...