首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift AVPlayer seekToTime问题

Swift AVPlayer seekToTime问题
EN

Stack Overflow用户
提问于 2016-07-20 08:05:17
回答 3查看 13.5K关注 0票数 5

我有这样的代码:

代码语言:javascript
复制
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只在视频的开头或结尾处寻找,而不是在中间。

印刷:

代码语言:javascript
复制
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狂欢节给出了我不想寻找的秒的正确值。抱歉英语不好,我是意大利人

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-21 03:14:42

对于AVPlayer来说,有不同的方式让剧本寻找时间;

代码语言:javascript
复制
player.seekToTime(<#time: CMTime#CMTime#>)

对于这种方法,播放器将寻求seekingTime的快速,但不是寻找确切的位置的seekingTime,这意味着将有一些偏移的seekingTime。

苹果公司的博士

使用此方法查找当前播放机项的指定时间。

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

有关样品的准确查找,请参阅查找时间:公差前:公差后:。

代码语言:javascript
复制
player.seekToTime(<#T##time: CMTime##CMTime#>, completionHandler: <#T##(Bool) -> Void#>)

对于这种方法,player将寻求快速的seekingTime,而且,对于偏移量,您可以使用completionHandler进行一些操作。

苹果公司的博士

使用此方法查找当前播放机项的指定时间,并在搜索操作完成时得到通知。

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

设定为不。如果新请求完成,而不被另一个寻求请求或任何其他操作中断,则指定

将调用完成处理程序,并将完成的参数设置为YES。

如果您想要寻找更精确的方法,请使用以下方法来代替

代码语言:javascript
复制
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#>)

此方法将允许玩家请求指定的时间,但速度较慢(well..mostly取决于当前媒体)。

苹果公司的博士

使用此方法查找当前播放机项的指定时间。

所寻找的时间将在范围内的时间公差之前,time+toleranceAfter和可能不同的指定时间的效率。

通过kCMTimeZero使toleranceBefore和toleranceAfter都请求准确地查找样本,这可能会导致额外的解码延迟。

传递此方法的前容性:kCMTimePositiveInfinity和后容忍:kCMTimePositiveInfinity与消息传递seekToTime:直接相同。

我注意到你用的电流

代码语言:javascript
复制
avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate))

您可以尝试使用此方法来寻找指定的时间(当然,比较慢)。

代码语言:javascript
复制
avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

希望能帮到你

票数 10
EN

Stack Overflow用户

发布于 2019-03-09 07:07:37

在Swift 4.2和Xcode 10.1中

代码语言:javascript
复制
player?.seek(to: CMTimeMakeWithSeconds(100, preferredTimescale: 1), toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero)
票数 4
EN

Stack Overflow用户

发布于 2018-06-25 13:33:52

这对我有用。关键是将kCMTimeZero放在两个公差字段中。

代码语言:javascript
复制
player.seek(to: CMTimeMakeWithSeconds(value, duration), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38475702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档