Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

ios - Pan Gesture with AVPlayer

This feature is really important to my app and would really like some help on it. Basically, I want to add a UIPanGestureRecognizer to a video player so that the user can fast forward/rewind the video with the gesture.

Apple has some sample code which uses Swift 3 and has the entire video player already created. The only thing missing is the UIPanGestureRecognizer. This is the link: https://developer.apple.com/library/content/samplecode/AVFoundationSimplePlayer-iOS/Introduction/Intro.html#//apple_ref/doc/uid/TP40016103

In viewWillAppear I added the gesture like so:

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture))
view.addGestureRecognizer(panGesture)

This is the code that is working somewhat. It is currently scrubbing.

The problem is that every time I start the pan gesture, the video skips to the middle and I start from there. Instead of fast forwarding/rewinding from where the video currently is, the pan gesture skips the video to the middle and then allows me to fast forward/rewind which is not good.

func handlePanGesture(sender: UIPanGestureRecognizer) {
    switch sender.state {
    case .began, .changed:
        let translation = sender.translation(in: self.view)
        var horizontalTranslation = Float(translation.x)

        let durationInSeconds = Float(CMTimeGetSeconds(player.currentItem!.asset.duration))

        // Using 275 as the limit for delta along x
        let translationLimit: Float = 275
        let minTranslation: Float = -1 * translationLimit
        let maxTranslation: Float = translationLimit

        if horizontalTranslation > maxTranslation {
            horizontalTranslation = maxTranslation
        }

        if horizontalTranslation < minTranslation {
            horizontalTranslation = minTranslation
        }

        let timeToSeekTo = normalize(delta: horizontalTranslation , minDelta: minTranslation, maxDelta: maxTranslation, minDuration: 0, maxDuration: durationInSeconds)
        print("horizontal translation (horizontalTranslation) 
 timeToSeekTo: (timeToSeekTo)")

        let cmTime = CMTimeMakeWithSeconds(Float64(timeToSeekTo), self.player.currentTime().timescale)
        player.seek(to: cmTime)

    default:
        print("default")
    }

}

func normalize(delta: Float, minDelta: Float, maxDelta: Float, minDuration: Float, maxDuration: Float) -> Float {

    let result = ((delta - minDelta) * (maxDuration - minDuration) / (maxDelta - minDelta) + minDuration)
    return result
}

Any help would be great - thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Thanks for your code. I used it, changed few lines, it's working well.

   @objc func handlePanGesture(sender: UIPanGestureRecognizer) {
      switch sender.state {
       case .began, .changed:
        let translation = sender.translation(in: self.view)
        let horizontalTranslation = Float(translation.x)

        let durationInSeconds = Float(CMTimeGetSeconds(player.currentItem!.asset.duration))

        // normalize based on duration and width of the view
        let scale:Float = durationInSeconds / Float(self.view.frame.width) / 4
        // then you need to add the current time of player to avoid it starting from the middle.            
        let seekTime = horizontalTranslation * scale + Float((self.player.currentItem?.currentTime().seconds)!)

        let cmTime = CMTimeMakeWithSeconds(Float64(Float(seekTime)), preferredTimescale: self.player.currentTime().timescale)
        player.seek(to: cmTime)
        print("horizontal translation (horizontalTranslation) 
 timeToSeekTo: (seekTime)")

    default:
        print("default")
    }

}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...