2013-10-28 2 views
0

Мое приложение в настоящее время воспроизводит 2 видео одновременно, функционально, но я все ответы SO, которые я видел, использует много кода Key-Value. Это плохо/неправильно, если я просто делаю минимальный минимум, указанный ниже?Воспроизведение видео в AVPlayer

viewdidload

AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL URLWithString:firstVideo.videoURL]]; 
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset]; 
    self.player1 = [AVPlayer playerWithPlayerItem:item]; 
    [topPlayer setMovieToPlayer:self.player1]; 


    AVURLAsset *asset2 = [AVURLAsset assetWithURL:[NSURL URLWithString:secondVideo.videoURL]]; 
    AVPlayerItem *item2 = [AVPlayerItem playerItemWithAsset:asset2]; 
    self.player2 = [AVPlayer playerWithPlayerItem:item2]; 
    [bottomPlayer setMovieToPlayer:self.player2]; 

    ((AVPlayerLayer *)[self.topPlayer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill; 
    ((AVPlayerLayer *)[self.bottomPlayer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill; 
    [self.player1 play]; 
    [self.player2 play]; 

Приведенный выше код все, что я использовать для воспроизведения видео, и она отлично работает. Время от времени происходит ~ 1 с, как я могу подождать, пока оба видео будут готовы к воспроизведению, а затем сыграйте их обоих?

ответ

2

использовать KVO, чтобы наблюдать за состоянием игрока и воспроизводить видео, когда статус обоих готов.

[yourPlayerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil]; 

и КВО:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"status"]) { 
     AVPlayerStatus status = [change[NSKeyValueChangeNewKey] integerValue]; 
     switch (status) { 
      case AVPlayerStatusUnknown: 
       //do something 
       break; 
      case AVPlayerStatusReadyToPlay: 
      { 
       //check which avplayer is ready, by check the parametric object isEqual:yourPlayerItem 
       //use a bool value to record the ready status. after two bools are YES, then play the video 
      } 
       break; 
      case AVPlayerStatusFailed: 
      { 
       AVPlayerItem *playerItem = (AVPlayerItem *)object; 
       [self assetFailedToPrepareForPlayback:playerItem.error]; 
      } 
       break; 

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