我有这个代码:

let punto = sender.locationInView(self.barraVideo).x
        let larghezzaImg : Double = Double((self.barraVideoInvisTocco?.frame.width)!)

        let percTocco : Double = (100 / larghezzaImg) * Double(punto)

        let lunghezzaVideo : Double = Double(CGFloat((avPlayer?.currentItem?.asset.duration.value)!) / CGFloat(1000.0));
        let frameRate : Int32 = (avPlayer?.currentItem?.currentTime().timescale)!

        let secondo : Float64 = Float64((lunghezzaVideo/100)*percTocco)
        print("Val : \(secondo)");

        avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate))

        avPlayer?.play()
        videoInPlay = true;
        playPauseBtn!.image = UIImage(named: "iconaPausa.png")!;

接收在seekBar 上点击的x 坐标并搜索视频。
该代码适用于日志视频,但适用于短视频非常糟糕。
当我点击短视频时,AVPlayer 只在视频的开头或结尾附近搜索,而不是在中间

打印 :
Val : 3.36008475976495
Val : 7.14189817632069
Val : 13.3303201306846
Val : 3.70388597945183
Val : 3.93308679257642
Val : 3.24548435320265
Val : 3.70388597945183
Val : 18.8311396456748
Val : 27.0823689181601
Val : 40.1468152662618
Val : 51.3776551093667
Val : 17.2267339538027
Val : 9.54850671412889
Val : 23.4151559081666
Val : 37.6256063218913

val rap代表了我不会寻找的正确秒数。
抱歉英语不好,我是意大利人

最佳答案

对于AVPlayer,有不同的方式让play找时间;

player.seekToTime(<#time: CMTime#CMTime#>)

对于这种方法,玩家会快速寻找seekingTime,但不会寻找seekingTime的确切位置,这意味着seekingTime会有一些偏移

Apple 文档

使用此方法为当前播放器项目寻找指定时间。

寻求的时间可能与效率的指定时间不同。

有关样本准确搜索,请参阅seekToTime:toleranceBefore:toleranceAfter:。
player.seekToTime(<#T##time: CMTime##CMTime#>, completionHandler: <#T##(Bool) -> Void#>)

对于这种方法,玩家将快速寻求seekingTime,并且通过偏移量,您可以使用completionHandler做一些事情

Apple 文档

使用此方法为当前播放器项目寻找指定时间,并在寻找操作完成时收到通知。

任何仍在处理中的先前搜索请求的完成处理程序将立即使用完成的参数调用

设置为否。如果新请求在没有被另一个搜索请求或任何其他指定操作中断的情况下完成

完成处理程序将在完成参数设置为 YES 的情况下被调用。

如果想求更准确,用下面的方法代替
player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>)

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>, completionHandler: <#T##(Bool) -> Void#>)

这种方法会让玩家寻求你要求的指定时间,但会更慢(嗯..主要取决于当前媒体)

Apple 文档

使用此方法为当前播放器项目寻找指定时间。

寻求的时间将在 [time-toleranceBefore, time+toleranceAfter] 范围内,并且可能与指定的时间不同以提高效率。

为toleranceBefore 和toleranceAfter 传递kCMTimeZero 以请求样本准确搜索,这可能会导致额外的解码延迟。

使用 beforeTolerance:kCMTimePositiveInfinity 和 afterTolerance:kCMTimePositiveInfinity 向此方法发送消息与直接发送消息seekToTime:相同。

我注意到当前您正在使用
avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate))

您可以尝试使用此方法来寻找指定时间
(当然更慢)
avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

希望可以帮助你

关于Swift AVPlayer seekToTime 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38475702/

10-08 20:49