2016-04-28 3 views
0

У меня есть UITableViewCell. Он имеет 2 AVPlayers, 2 AVPlayerItems и 2 AVPlayerLayers. Один AVPlayer и его содержимое находятся в правой части ячейки, а один - в левой части ячейки. Я использую AVAssetResourceLoader для кеширования и воспроизведения видео одновременно. Это отлично работает, за исключением того, что второе видео не отображается. Он правильно кэширует, потому что после прокрутки tableview он воспроизводится правильно, как следует из кеша. Но только AVPlayerLayer не отображает видеоконтент, как он должен.NSTimer не передает параметры правильно?

AVAssetResourceLoader не может обрабатывать 2 одновременных загрузки. При первой загрузке tableview, видео слева начинает загружаться/воспроизводиться. Код для воспроизведения видео с правой стороны читается сразу после кода для загрузки/воспроизведения видео с левой стороны - что означает, конечно, что процесс загрузки еще не закончен. Чтобы устранить эту проблему, я создал таймер, например, так:

if (self.downloadInProgress) { 
     // download is in progress. wait to start next download 
     self.downloadQueueCount++; 
     NSDictionary *videoSettings = @{@"id": activity2.objectId, 
     @"activity": activity2, @"cell": videoCell, @"left": @NO} 

     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 
     target:self selector:@selector(DownloadNextVideo:) 
     userInfo:videoSettings repeats:YES]; 
    } else { 
    [self playStreamingVideoOnRightInCell:videoCell withActivity:activity2]; 
} 

И тогда селектор метода:

- (void)DownloadNextVideo:(NSTimer *)timer { 
    if (self.downloadInProgress == NO) { 
    NSString *activityId = [[timer userInfo] objectForKey:@"id"]; 
    self.videoChallengeID1 = activityId; 
    CompletedTableViewCell *videoCell = (CompletedTableViewCell *)[[timer userInfo]objectForKey:@"cell"]; 
    Activity *activity = [[timer userInfo] objectForKey:@"activity"]; 
    BOOL left = [[timer userInfo] objectForKey:@"left"]; 
    [self.timer invalidate]; 
    if (left) { 
     [self playStreamingVideoOnLeftInCell:videoCell withActivity:activity]; 
    } else { 
     [self playStreamingVideoOnRightInCell:videoCell withActivity:activity]; 
    } 
    } 
} 

В принципе, это работает правильно - AVAssetResourceLoader получает правильный URL, правильно ActivityID , и загружает/кэширует правильное видео, за исключением того, что видео не воспроизводится по мере его загрузки. Я изменил цвета фона, и я могу подтвердить, что AVPlayerLayer действительно присутствует в кадре, который должен быть. Просто видео не появляется.

Я попытался переключить видео влево и вправо и загрузить заказ - и в этом случае воспроизводится правильное видео, а левое видео не воспроизводится. В основном, какое видео должно использовать этот таймер и постоянно проверять, выполняется ли загрузка или нет, это видео, которое не отображается правильно, и это заставляет меня думать, что это то, что я делаю неправильно с таймером относительно переменных/переменных ,

Одна последняя деталь, в случае, если это может помочь. Если я скажу следующее (вместо первого метода я был здесь):

if (self.downloadInProgress) { 
    [self playStreamingVideoOnRightInCell:videoCell withActivity:activity2]; 

}

Затем playerLayer НЕ показывать видео - но это неправильное видео. Он показывает то же видео, что и в левой части ячейки.

Это был кошмар для отладки, и я довольно уверен в этом, что он имеет какое-то отношение к использованию таймера здесь, чтобы воспроизводить видео, а не делать это в обычной области. У кого-нибудь есть идеи, что я могу делать неправильно?

ответ

1

Чтобы исправить правильное воспроизведение видео, вам необходимо изменить следующее. Вы используете значение NSNumber вместо BOOL для значения left.

Ваш код:

BOOL left = [[timer userInfo] objectForKey:@"left"]; 

Должно быть:

BOOL left = [[[timer userInfo] objectForKey:@"left"] boolValue]; 
Смежные вопросы