Objective c 加载资产后立即搜索到AVPlayer中的某个位置

Objective c 加载资产后立即搜索到AVPlayer中的某个位置,objective-c,ios,cocoa-touch,video,avplayer,Objective C,Ios,Cocoa Touch,Video,Avplayer,这是可行的:我有一个AVPlayer,它在加载视频后立即播放视频。这个很好用 这不是: 我希望在给定的位置播放视频,而不是从一开始就开始播放视频。因此,我会等待资产准备好使用KVO进行播放: BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay) 然后寻找到给定的时间 [playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:

这是可行的:我有一个
AVPlayer
,它在加载视频后立即播放视频。这个很好用

这不是:

我希望在给定的位置播放视频,而不是从一开始就开始播放视频。因此,我会等待资产准备好使用KVO进行播放:

BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)
然后寻找到给定的时间

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];
但在初始搜索时,播放器总是在视频开始时启动

更新 我在几秒钟后尝试了一次调度,但也不起作用。它在播放后工作,但最初从不工作


当我观察
self.player.currentItem.duration
时,我不断得到
0
作为
时间刻度

<

  • 当检查玩家是否准备好玩游戏时,我会检查玩家本身以及玩家当前的物品

    if(self.player.status == AVPlayerStatusReadyToPlay &&
       self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
        [self.player play];
    }
    
  • 例如,如果您寻求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];
    

  • 你是说如果你延迟它,它会起作用吗?你确定你传递了一个有效的时间参数吗?视频中间的时间值是多少?视频大约是30分钟。我还尝试了CMTimakewotgseconds(15,1),这肯定在边界内,你说它在播放后工作。也许这是一个愚蠢的问题,但如果你播放然后立即搜索会发生什么?一点也不愚蠢:-)问题是因为设置滑块会触发初始播放,所以我不想从头开始,除非滑块设置为曲目的开始…AVPlayerStatusReadyToPlay不是一种终极检查方式吗?为什么要检查物品的状态?我遇到过这样的情况:玩家已经准备好了,但物品还没有准备好,反之亦然。
    [AVPlayerItem status]
    文档说明“表示播放器已准备好播放AVPlayerItem实例”。
    [AVPlayerItem status]
    说明“该项目已准备好播放。”。因此,能够播放项目与当前项目实际准备就绪之间存在差异。我使用AVPlayerItemStatusReadyToPlay Only创建答案。特别是对于较短的视频,kCMTimeZero tolerance没有任何延迟,显示了非常平滑的过渡。你是上帝。很好的解释和很好的例子。它就像一个符咒!