AVPlayer seektotime with Pangesturerecognizer

Posted

技术标签:

【中文标题】AVPlayer seektotime with Pangesturerecognizer【英文标题】: 【发布时间】:2016-05-18 20:24:11 【问题描述】:

我正在尝试将 seektotime 与 Pangesture 识别器一起使用。但它没有按预期进行搜索。

let totalTime = self.avPlayer.currentItem!.duration
    print("time: \(CMTimeGetSeconds(totalTime))")
    self.avPlayer.pause()
    let touchDelta = swipeGesture.translationInView(self.view).x / CGFloat(CMTimeGetSeconds(totalTime))
    let currentTime = CMTimeGetSeconds((avPlayer.currentItem?.currentTime())!) + Float64(touchDelta)
    print(currentTime)
    if currentTime >= 0 && currentTime <= CMTimeGetSeconds(totalTime) 
        let newTime = CMTimeMakeWithSeconds(currentTime, Int32(NSEC_PER_SEC))
        print(newTime)
        self.avPlayer.seekToTime(newTime)
    

我在这里做错了什么?

【问题讨论】:

如果你在移动 seekToTime 时使用 UISlider? 我没有使用 UISlider 来移动 seektotime 我只是想用 pangesture 左右移动来前后移动视频 使用我的 sliderAction:在你的 Pangesture Actions 中,希望有帮助 【参考方案1】:

想想这里发生了什么:

let touchDelta = swipeGesture.translationInView(self.view).x / CGFloat(CMTimeGetSeconds(totalTime))

您将像素(仅在 x 轴上的平移)除以时间。这真的不是“增量”或绝对差异。这是一种比例。但这不是一个有任何意义的比率。然后,您只需将此比率添加到之前的 currentTime,即可获得新的 currentTime,因此您将每秒像素数与像素数相加,这并没有给出逻辑或有用的数字。

我们需要做的是从手势中获取 x 轴平移并对其应用 缩放(这是一个比率),以便获得有用的秒数来前进/后退AVPlayer。 x 轴平移以像素为单位,因此我们需要一个描述每像素秒数的比例,并将两者相乘以获得我们的秒数。正确的比例是视频中的总秒数与用户在手势中可以移动的总像素数之间的比率。将像素乘以(秒除以像素)可以得到一个以秒为单位的数字。在伪代码中:

scale = totalSeconds / totalPixels
timeDelta = translation * scale
currentTime = oldTime + timeDelta

所以我会这样重写你的代码:

let totalTime = self.avPlayer.currentItem!.duration
print("time: \(CMTimeGetSeconds(totalTime))")
self.avPlayer.pause()

// BEGIN NEW CODE
let touchDelta = swipeGesture.translationInView(self.view).x
let scale = CGFloat(CMTimeGetSeconds(totalTime)) / self.view.bounds.width
let timeDelta = touchDelta * scale
let currentTime = CMTimeGetSeconds((avPlayer.currentItem?.currentTime())!) + Float64(timeDelta)
// END NEW CODE

print(currentTime)
if currentTime >= 0 && currentTime <= CMTimeGetSeconds(totalTime) 
    let newTime = CMTimeMakeWithSeconds(currentTime, Int32(NSEC_PER_SEC))
    print(newTime)
    self.avPlayer.seekToTime(newTime)

【讨论】:

【参考方案2】:

我有同样的问题,然后我创建 UISlider 并设置下面给出的操作方法,

声明 AVPlayer 是 var playerVal = AVPlayer()

@IBAction func sliderAction(sender: UISlider) 

    playerVal.pause()
    displayLink.invalidate()
    let newTime:CMTime = CMTimeMakeWithSeconds(Double(self.getAudioDuration() as! NSNumber) * Double(sender.value), playerVal.currentTime().timescale)
    playerVal.seekToTime(newTime)

    updateTime()

    playerVal.play()

    deepLink()


 

另一种方法是,

func updateTime() 

        let currentTime = Float(CMTimeGetSeconds(playerItem1.currentTime()))
        let minutes = currentTime/60
        let seconds = currentTime - minutes * 60

        let maxTime =  Float(self.getAudioDuration() as! NSNumber)
        let maxminutes = maxTime / 60
        let maxseconds = maxTime - maxminutes * 60

        startValue.text = NSString(format: "%.2f:%.2f", minutes,seconds) as String
        stopValue.text = NSString(format: "%.2f:%.2f", maxminutes,maxseconds) as String
    

我使用了 CADisplayLink 并声明了 var displayLink = CADisplayLink(),它使用了继续(自动)播放音频。代码是

func deepLink() 
        displayLink = CADisplayLink(target: self, selector: ("updateSliderProgress"))
        displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    

func updateSliderProgress()
        let progress = Float(CMTimeGetSeconds(playerVal.currentTime())) / Float(self.getAudioDuration() as! NSNumber)
        sliderView.setValue(Float(progress), animated: false)
    

如果您看到上面的答案,您就有了想法,希望对您有所帮助

【讨论】:

以上是关于AVPlayer seektotime with Pangesturerecognizer的主要内容,如果未能解决你的问题,请参考以下文章

AvPlayer seekToTime 问题

AVPlayer seekToTime 导致播放器停止播放

AVPlayer seekToTime 不正确使用 UISlider

AVPlayer SeekToTime 不工作。每次从头开始

AVPlayer seekToTime:循环播放短视频时性能不佳

iOS AVPlayer seektotime 锁定在某些点