【问题标题】:Playing videos in AVPlayer在 AVPlayer 中播放视频
【发布时间】:2013-10-28 00:46:36
【问题描述】:

我的应用目前在功能上同时播放 2 个视频,但我看到的所有 SO 答案都使用了大量的键值代码。如果我只做下面列出的最低限度的工作,是不是很糟糕?

查看已加载

 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 秒的延迟,我该如何等到两个视频都准备好播放,然后再播放它们?

【问题讨论】:

    标签: ios objective-c cocoa-touch avplayer


    【解决方案1】:

    使用 KVO 观察播放器的状态,并在两者状态就绪时播放视频。

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

    在 kvo 中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2012-07-05
      相关资源
      最近更新 更多