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];
}

... и по-късно извадете изгледа от someViews като този:

- (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