Swift - UISlider 作为视频洗涤器的平滑度问题

Posted

技术标签:

【中文标题】Swift - UISlider 作为视频洗涤器的平滑度问题【英文标题】:Swift - UISlider as video scrubber smoothness issue 【发布时间】:2016-05-12 02:04:31 【问题描述】:

所以我一直在使用 UISlider 开发视频清理器,并且在大多数情况下它工作得很好。它能够通过视频向前平滑地逐帧移动,但是当我向后移动时,它会变得不稳定并且不那么平滑。下面是我擦洗视频的代码:

func sliderBeganTracking(slider: CustomUISlider!) 
    if isPlaying == true 
        self.touchCount += 1
        pauseVideo()
    


func sliderValueChanged(slider: CustomUISlider!) 
    let videoDuration = CMTimeGetSeconds(player.currentItem!.duration)
    let elapsedTime: Float64 = videoDuration * Float64(chosePosSlider.value)
    let time: CMTime = CMTimeMakeWithSeconds(elapsedTime, self.player.currentTime().timescale)

    self.player.seekToTime(time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

任何人都知道为什么当我尝试向后滑动时它会停止平稳运行和/或是否有更好的解决方案或方法来创建一个可以平滑滑动视频的 UISlider? T

【问题讨论】:

【参考方案1】:

这里的问题(双关语不是有意的)与视频编码播放的方式有关。几乎所有视频标准都使用“关键帧”模型,其中对单个帧的整个图像进行编码,然后进行一系列较小的增量更改,以记录从最后一个关键帧开始更改的像素。这使您可以存储整个视频,而无需存储每一帧的每个像素。

虽然这在播放视频时效果很好向前,因为操作系统可以将增量更改应用到内存中已有的像素,但在播放时效果不佳向后,因为不可能以相同的方式“撤消”增量。这就是为什么您可以顺利播放向前,但是当您向后播放时,事情会变得不稳定,因为操作系统会向后跳到最近的关键帧。

您的解决方案与this question about negative playback rates 的解决方案相同。 TLDR;是将有问题的视频重新编码为每一帧都是关键帧的格式。您可以在视频软件中执行此操作,也可以将视频转换为 PhotoJPEG 等格式。

【讨论】:

以上是关于Swift - UISlider 作为视频洗涤器的平滑度问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中:如何使用 uislider 值作为变量来设置旋转速度

我想切换时间洗涤器以执行 15 分钟间隔

如何在 Swift 中为 UISlider 的值添加百分号

在HTML5中获取视频元素的控件(洗涤器)元素

PanGesture 事件干扰洗涤器清理事件

Swift 检测 UISlider 图像点击