使用AVPlayer实现流畅的视频清理

Mc.*_*ver 12 iphone xcode ios avplayer swift

我试图AVPlayer通过UISlider搜索来实现流畅的视频清理,似乎Apple有技术问答并解释了如何实现这一点,但我的问题是如何使用此方法并使用UISlider更改播放器当前时间: stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime)

这是我的代码:

//Play Intro Movie
let videoURL = Bundle.main.url(forResource: "intro", withExtension: "mp4")
player = AVPlayer(url:videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.frame
view.layer.addSublayer(playerLayer)
//videoPlayer.play()


view.addSubview(slider)
slider.maximumValue = 0
slider.maximumValue = Float(CMTimeGetSeconds((player.currentItem?.asset.duration)!))
Run Code Online (Sandbox Code Playgroud)

这是Apple示例代码:

func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime)
    {
        player.pause()

        if CMTimeCompare(newChaseTime, chaseTime) != 0
        {
            chaseTime = newChaseTime;

            if !isSeekInProgress
            {
                trySeekToChaseTime()
            }
        }
    }




    func trySeekToChaseTime()
    {
        if playerCurrentItemStatus == .unknown
        {
            // wait until item becomes ready (KVO player.currentItem.status)
        }
        else if playerCurrentItemStatus == .readyToPlay
        {
            actuallySeekToTime()
        }
    }


    func actuallySeekToTime()
    {
        isSeekInProgress = true
        let seekTimeInProgress = chaseTime
        player.seek(to: seekTimeInProgress, toleranceBefore: kCMTimeZero,
                          toleranceAfter: kCMTimeZero, completionHandler:
            { (isFinished:Bool) -> Void in

                if CMTimeCompare(seekTimeInProgress, self.chaseTime) == 0
                {
                    self.isSeekInProgress = false
                }
                else
                {
                    self.trySeekToChaseTime()
                }
        })
    }
Run Code Online (Sandbox Code Playgroud)

Aya*_*mon 5

虽然我使用的方法与您不同stopPlayingAndSeekSmoothlyToTime,但我认为我应该帮助您解决玩家的寻找行动。

func sliderValueChanged() {
    var timeToSeek = player.currentItem?.asset.duration.seconds
    timeToSeek = timeToSeek * Double(slider.value)
    player.seek(to: CMTimeMake(Int64(timeToSeek), 1))
}
Run Code Online (Sandbox Code Playgroud)

您也应该将 设置slider.maximumValue为 1。希望这会有所帮助。

注意:请不要忘记处理currentItem可选值。如果是,nil您应该为timeToSeek变量设置值 0 。


Sur*_*dar 4

在滑块值更改事件中,只需调用

stopPlayingAndSeekSmoothlyToTime(CMTime.init(seconds: (player.currentItem?.asset.duration.seconds)!* slider.value, preferredTimescale: 1000))

苹果的示例代码将更改播放器的当前时间。如果您非常快速地滑动滑块,您还可以调整toleranceBefore 和toleranceAfter。