2013-10-28 51 views
0

我的应用程序目前在功能上同时播放2个视频,但我所见到的所有答案都是利用了许多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; 

     } 
    } 
}