【问题标题】:Seek to a certain position in AVPlayer right after the asset was loaded加载资源后立即在 AVPlayer 中查找某个位置
【发布时间】:2012-08-21 11:26:04
【问题描述】:

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

这不是

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

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

然后寻找给定的时间

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

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

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

当我观察到self.player.currentItem.duration 时,我不断将0 作为valuetimescale

【问题讨论】:

  • 你是说如果你延迟它会起作用吗?
  • 你确定你传递了一个有效的时间参数吗? timeInTheMiddleOfTheVideo 的值是多少?
  • 视频大约 30 分钟。我还尝试了 CMTimakewotgseconds(15,1),它绝对在界限内
  • 你说播放后就可以了。也许对我来说这是一个愚蠢的问题,但如果你玩然后立即寻找会发生什么?
  • 根本不是一个愚蠢的问题:-) 问题是因为设置一个滑块会触发初始播放,所以我不想从头开始,除非滑块设置为开始轨道...

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


【解决方案1】:

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

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

【讨论】:

  • AVPlayerStatusReadyToPlay 不是检查的终极方法吗?为什么要检查项目状态?
  • 我遇到了播放器准备好但项目未准备好的情况,反之亦然。 [AVPlayer status] 文档说“表明播放器已准备好播放 AVPlayerItem 实例。”和[AVPlayerItem status]“该项目已准备好播放。”。因此,能够播放项目与当前项目实际准备就绪是有区别的。
  • 我只使用 AVPlayerItemStatusReadyToPlay
  • 很好的答案。特别是对于较短的视频,kCMTimeZero 容差没有任何延迟,并且显示出非常平滑的过渡。
  • 你是神。很好的解释和很好的例子。它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2020-10-23
相关资源
最近更新 更多