21

这有效:我有一个AVPlayer在加载视频后立即播放的视频。这很好用。

这不会

我不想从头开始播放视频,而是想在给定位置播放它。所以我等到资产准备好使用 KVO 进行播放:

BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)

然后寻找给定的时间

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

但是播放器将始终在初始搜索时从视频的开头开始。

更新 我在几秒钟内尝试了 dispatch_after ,但这也不起作用。它在播放后有效,但最初从不。

当我观察时,self.player.currentItem.duration我不断0得到valueand timescale

4

1 回答 1

51

几件事可能对您有所帮助:

  1. 在检查播放器是否准备好播放时,我会检查播放器本身以及播放器的当前项目。

    if(self.player.status == AVPlayerStatusReadyToPlay &&
       self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
        [self.player play];
    }
    
  2. 如果您寻求例如 15 秒,它可能会从视频的开头开始,而不是如果那是最近关键帧的位置。要强制玩家寻找确切的位置(注意:这将需要几秒钟的时间),请执行以下操作:

    Float64 seconds = 500.0f;
    CMTime targetTime = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
    [self.player seekToTime:targetTime
     toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
    

    或者,您可以通过将参数之一指定为无穷大来显式地在指定点之前/之后寻找关键帧:

    [self.player seekToTime:targetTime
     toleranceBefore:kCMTimePositiveInfinity toleranceAfter:kCMTimeZero];
    
于 2012-08-27T02:23:04.950 回答