簡體   English   中英

Swift iOS -CMTimeMakeWithSeconds:警告:由於時間比例非常低,引入了-0.433錯誤

[英]Swift iOS -CMTimeMakeWithSeconds: warning: error of -0.433 introduced due to very low timescale

我正在使用AVPlayer播放視頻。 我遵循了此視頻教程, 讓我們構建該應用程序

我使用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)
}

視頻播放到最后,但問題是滑塊僅到達10秒點,而我無法到達最后的0.43秒。 我收到以下警告消息:

在此處輸入圖片說明

滑塊的值是在player?.addPeriodicTimeObserver()確定的player?.addPeriodicTimeObserver()因此,當我按快進而不是滑塊到達終點時,它會停止幾個點的距離(注意空白):

在此處輸入圖片說明

如何獲得更准確的值,以便滑塊可以一直擦洗到底?

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)

我也遵循了這個答案 ,訣竅在於,當我為第二個參數初始化搜索時間時,必須投入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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM