在加载资产后立即在AVPlayer中寻找某个位置

时间:2012-08-26 21:36:58

标签: objective-c ios cocoa-touch video avplayer

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

这不

我想在一个给定的位置播放视频,而不是在开头播放视频。所以我等到资产准备好使用KVO播放:

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

然后寻求给定的时间

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

但是玩家将始终在初始搜索的视频开头处开始。

更新 我尝试了几秒钟的dispatch_after,但这也不起作用。它在播放后工作,但从不开始。

当我观察self.player.currentItem.duration时,我会0value继续获得timescale

1 个答案:

答案 0 :(得分:45)

可以帮助你的一些事情:

  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];