2016-04-22 2 views
1

У меня есть ячейки UITableView, каждый из которых имеет 2 AVPlayers. Один на правой стороне и один на левой стороне. И чтобы согласиться с этим, 2 AVPlayerLayers, 2 AVPlayerItems и т. Д. Точная настройка по каждой стороне ячейки. Кроме того, видео с правой стороны ячейки не воспроизводится. Вот код, который воспроизводит видео просто отлично на левой стороне:AVPlayer на левой стороне камеры работает отлично. AVPlayer на правой стороне ячейки не работает

- (void)playVideoOnLeftFromCache:(CompletedTableViewCell *)videoCell { 
    videoCell.contentView.backgroundColor = [UIColor clearColor]; 
    videoCell.redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, (videoCell.frame.size.width/2), 255)]; 
    [videoCell.contentView insertSubview:videoCell.redView aboveSubview:videoCell.blueView]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *mov = @".mov"; 
    NSString *fullComponent = [NSString stringWithFormat: @"%@%@", self.videoChallengeID1, mov]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:fullComponent]; 
    NSURL *url = [NSURL fileURLWithPath:fullPath]; 

    videoCell.item1 = [AVPlayerItem playerItemWithURL:url]; 
    videoCell.player1 = [[AVPlayer alloc] initWithPlayerItem:videoCell.item1]; 
    [videoCell.player1 setMuted:YES]; 
    videoCell.player1.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(player1Finished:) 
     name:AVPlayerItemDidPlayToEndTimeNotification object:[videoCell.player1 currentItem]]; videoCell.playerLayer1 = [AVPlayerLayer playerLayerWithPlayer:videoCell.player1]; 
    videoCell.playerLayer1.frame = CGRectMake(0, 0, (videoCell.frame.size.width/2), 255); 
    videoCell.playerLayer1.backgroundColor = [UIColor clearColor].CGColor; 
    videoCell.playerLayer1.videoGravity = AVLayerVideoGravityResize; 
    [videoCell.redView.layer addSublayer:videoCell.playerLayer1]; 
    [videoCell.player1 play]; 
} 

Как я уже говорил выше, что работает просто отлично. Для правой стороны клетки, у меня есть почти идентичный код, просто перемещая рамки вокруг, чтобы сделать его на правой стороне:

- (void)playVideoOnRightFromCache:(CompletedTableViewCell *)videoCell { 
videoCell.contentView.backgroundColor = [UIColor clearColor]; 
videoCell.redView2 = [[UIView alloc] initWithFrame:CGRectMake((videoCell.frame.size.width/2), 0, (videoCell.frame.size.width/2), 255)]; 
[videoCell.contentView insertSubview:videoCell.redView2 aboveSubview:videoCell.blueView2]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *mov = @".mov"; 
NSString *fullComponent = [NSString stringWithFormat: @"%@%@", self.videoChallengeID1, mov]; 
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:fullComponent]; 
NSURL *url = [NSURL fileURLWithPath:fullPath]; 

videoCell.item2 = [AVPlayerItem playerItemWithURL:url]; 
videoCell.player2 = [[AVPlayer alloc] initWithPlayerItem:videoCell.item2]; 
[videoCell.player2 setMuted:YES]; 
videoCell.player2.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(player1Finished:) 
              name:AVPlayerItemDidPlayToEndTimeNotification object:[videoCell.player2 currentItem]]; 
videoCell.playerLayer2 = [AVPlayerLayer playerLayerWithPlayer:videoCell.player2]; 
videoCell.playerLayer2.frame = CGRectMake((videoCell.frame.size.width/2), 0, (videoCell.frame.size.width/2), 255); 
videoCell.redView2.layer.backgroundColor = [UIColor orangeColor].CGColor; 
videoCell.blueView2.backgroundColor = [UIColor blueColor]; 
videoCell.playerLayer2.videoGravity = AVLayerVideoGravityResize; 
[videoCell.redView2.layer addSublayer:videoCell.playerLayer2]; 
// [videoCell.player2 addObserver:videoCell forKeyPath:@"status" options:0 context:nil]; 
    [videoCell.player2 play]; 
} 

Единственного различие здесь является дополнительным изменением цвета фона, чтобы я мог видеть, где каждый view/layer находится. В настоящее время фон на правой стороне ячейки оранжевый - это означает, что у redView2 действительно правильный фрейм. После этого я добавляю playerLayer2 в качестве подуровня, но он просто ничего не отображает. Когда я пытаюсь изменить цвет фона, это ничего не меняет. Я попытался также настроить наблюдателя keyValue для воспроизведения видео после его готовности, и это тоже не помогло.

Что здесь может быть неправильно? Я очень смущен, поскольку эти две ситуации почти точно идентичны, за исключением фреймов. И это просто не работает.

Просто если необходима любая дополнительная информация, вот мой UITableViewCell класс:

@interface CompletedTableViewCell : UITableViewCell 


// Video Players 
    @property (strong, nonatomic) AVPlayer *player1; 
    @property (strong, nonatomic) AVPlayer *player2; 

@property (strong, nonatomic) AVPlayerItem *item1; 
@property (strong, nonatomic) AVPlayerItem *item2; 

@property (strong, nonatomic) AVPlayerLayer *playerLayer1; 
@property (strong, nonatomic) AVPlayerLayer *playerLayer2; 

@property (strong, nonatomic) UIView *redView; 
@property (strong, nonatomic) UIView *blueView; 

@property (strong, nonatomic) UIView *redView2; 
@property (strong, nonatomic) UIView *blueView2; 
@end 

Кто-нибудь есть какие-либо идеи, что может быть происходит?

+0

есть ли видео для обоих слоев или разных? потому что вы передаете 'self.videoChallengeID1' для обоих игроков в качестве пути или url – Lion

+0

видео разных для каждого игрокаLayer – joey

+0

, то почему вы передаете одинаковый url для обоих? – Lion

ответ

0

Я выяснил свою проблему. И в истинном идиотской моде, это было очень, очень просто исправить :)

В функции playVideoOnRightFromCache, мне просто нужно изменить эту строку:

videoCell.playerLayer2.frame = CGRectMake((videoCell.frame.size.width/2), 0, (videoCell.frame.size.width/2), 255); 

к этому:

videoCell.playerLayer2.frame = CGRectMake(0, 0, (videoCell.frame.size.width/2), 255); 

Проблема в том, что подслой я добавлял его к уже начатому на полпути через экран. Поэтому, когда я сделал x происхождение кадра playerLayer2 равным значению (videoCell.frame.size.width/2), я фактически делал начало начала воспроизведения playerLayer2 выключенным стороной экрана, поэтому не было видно.

Смежные вопросы