当前位置:  开发笔记 > 编程语言 > 正文

Swift AVPlayer seekToTime问题

如何解决《SwiftAVPlayerseekToTime问题》经验,为你挑选了1个好方法。

我有这个代码:

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上点击并寻找视频.该代码适用于日志视频,但对于短视频工作非常糟糕.当我点击短视频时,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表示我不会寻求的秒的正确值.抱歉英语不好,我是意大利人



1> RAGE_Devil_J..:

对于AVPlayer,有不同的方式让游戏寻求时间;

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

对于这种方法,玩家将寻求快速搜索时间但不寻求搜索时间的确切位置,这意味着搜索时间会有一些偏移.

Apple的Doc

使用此方法可以搜索当前玩家项目的指定时间.

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

对于样品的准确求求,请参见seekToTime:toleranceBefore:toleranceAfter:.

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

对于这种方法,玩家将寻求快速搜索时间,并且通过偏移量,您可以使用completionHandler执行某些操作

Apple的Doc

使用此方法可以搜索当前玩家项目的指定时间,并在搜索操作完成时收到通知.

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

设为NO.如果新请求完成而没有被另一个搜索请求或指定的任何其他操作中断

将完成的参数设置为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的Doc

使用此方法可以搜索当前玩家项目的指定时间.

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

通过kCMTimeZero for toleranceBefore和toleranceAfter请求样本准确搜索,这可能会导致额外的解码延迟.

使用beforeTolerance传递此方法:kCMTimePositiveInfinity和afterTolerance:kCMTimePositiveInfinity与消息传递seekToTime:直接相同.

我注意到你正在使用的电流

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

你可以尝试使用这种方法来寻找指定的时间(当然更慢)

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

希望可以帮助你

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有