ios - Swift iOS -CMTimeMakeWithSeconds : warning: error of -0. 433 由于时间尺度非常短而引入

标签 ios swift avplayer uislider cmtime

我正在使用 AVPlayer 播放视频。我跟着这个视频教程 Let's Build That App

我使用 UISlider/scrubber 来配合视频的当前帧/时间。

我有一个 10.43 秒的视频,我使用快进功能将我带到最后。

@objc fileprivate func fastForwardButtonTapped() {

        guard let playerItem = playerItem else { return }
        guard let player = player else { return }

        let duration: Float64 = CMTimeGetSeconds(playerItem.duration)
        let seekTime: CMTime = CMTimeMakeWithSeconds(duration, 1)
        player.seek(to: seekTime)
}

视频走到了最后,但问题是 slider 只走到了 10 秒点,我无法让它走到最后的 0.43 秒。我收到以下警告消息:

enter image description here

slider 的值在 player?.addPeriodicTimeObserver() 中确定因此,当我按下快进而不是 slider 走到尽头时,它会在几个点外停止(注意空白):

enter image description here

我怎样才能获得更准确的值,以便我的 slider 可以一直滑动到最后?

playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status),
                                options: [.old, .new],
                                context: &playerItemContext)

let interval = CMTime(value: 1, timescale: 2)

timeObserverToken = player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: {
    [weak self] (progressTime) in

    let seconds = CMTimeGetSeconds(progressTime)

    let secondsString = String(format: "%02d", Int(seconds) % 60)
    let minutesString = String(format: "%02d", Int(seconds) / 60)

    self?.currentTimeLabel.text = "\(minutesString):\(secondsString)"

    if let duration = self?.playerItem!.duration{

        let durationSeconds = CMTimeGetSeconds(duration)
        self?.slider.value = Float(seconds / durationSeconds) // SLIDER IS UPDATED HERE
    }
})

最佳答案

我做了一些研究,发现 AVPlayer 有一个 seek 方法:

player.seek(to: <CMTime>, toleranceBefore: <CMTime>, toleranceAfter: <CMTime>)

使用这种方法,您可以为其设置容差以补偿截断溢出,在我的情况下是额外的 -0.433 秒。

在第一个参数中,您输入了搜索时间,在第二个和第三个参数中,您输入了kCMTimeZero。像这样:

// seekTime is the time I’m seeking to
player.seek(to: seekTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

我也关注了this answer诀窍是当我为第二个参数初始化我的寻道时间时,我必须将 1000 设置为一切正常。像这样:

let seekTime: CMTime = CMTimeMakeWithSeconds(duration, 1000)

这是我的快进按钮的代码:

@objc fileprivate func fastForwardButtonTapped() {

        guard let playerItem = playerItem else { return }
        guard let player = player else { return }

        let duration: Float64 = CMTimeGetSeconds(playerItem.duration)
        let seekTime: CMTime = CMTimeMakeWithSeconds(duration, 1000)
        player.seek(to: seekTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
}

关于ios - Swift iOS -CMTimeMakeWithSeconds : warning: error of -0. 433 由于时间尺度非常短而引入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291377/

相关文章:

iOS xCode 如何从 iPhone 分发的目标设备列表中排除 iPhone 3GS?

ios - UIImagePickerController 不能在 Swift 中工作

ios - 在启动屏幕中执行代码已更新

uiimage - 从附加到AVPlayer的CALayer获取UIImage(从视频播放中提取帧)

ios - 如何知道 UITableViewCell 是否未显示在 UITableView 上

ios - 在 Swift3 中排序

ios - AWS cognito 示例应用程序的问题

ios - 如何快速计算 JSON 响应中的 bool 值

ios - UIAlertView破坏AVPlayer的音频进程

swift - 互联网不可用时无法播放下载的 HLS 内容