AVPlayerde 无缝快进和倒放.

作者: Y_Swordsman | 来源:发表于2018-04-27 10:13 被阅读148次

最近研究一个AVPlayer seekTime方法的 问题.这个方法虽然可以跳到指定的帧,但是如果你用拖动框去调动这个方法,你会发现这个方法会延迟.
我们查看系统的播放器,你会发现他是不会延迟.拖到哪就能显示当前帧.
我们查找API发现seekTime 还有一个

- (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter completionHandler:(void (^)(BOOL finished))completionHandler

这个方法发现官方的解释是:

在指定的时间范围内移动回放光标,并在查找操作完成或中断时调用指定的块。
使用此方法可以查找当前播放器项目的指定时间,并在查找操作完成时收到通知。
要求的时间将在[时间容差前,时间+容差后]范围内,并且可能与指定的效率时间不同。
将kCMTimeZero传递给toleranceBefore和toleranceAfter以请求采样精确搜索,这可能会导致额外的解码延迟。
使用beforeTolerance消息传递此方法:kCMTimePositiveInfinity和afterTolerance:kCMTimePositiveInfinity与消息传递seekToTime:直接相同。
任何之前正在处理的查找请求的完成处理程序将立即调用,并将完成的参数设置为NO。如果新的
请求完成而不被另一个查找请求或任何其他操作中断,指定的完成处理程序将被调用
完成参数设置为YES。

没错这个就是我们要找个.但是当你换成这个方法的时候,你会发现,没什么**用.
我们深究官方的解释我们要理解

任何之前正在处理的查找请求的完成处理程序将立即调用,并将完成的参数设置为NO。如果新的
请求完成而不被另一个查找请求或任何其他操作中断,指定的完成处理程序将被调用
完成参数设置为YES。

这几句话.是说completionHandler 没有完成的情况下不调用这个方法.如果你不间断调用seekTime的 话,则会造成前个seekTime操作的中断.我们只需要加个BOOL值就可以了.
上代码

- (void)processMovie:(NSURL*)assetURL{

    AVAsset *asset = [AVAsset assetWithURL:assetURL];
    float totalTime = CMTimeGetSeconds(asset.duration);
    process =  self.selectView.frame.origin.x / self.selectImageView.frame.size.width;
    NSLog(@"%f",process);
    [self.player pause];
    CMTime newChaseTime = CMTimeMake(totalTime * process * asset.duration.timescale, asset.duration.timescale);
    if (CMTIME_COMPARE_INLINE(newChaseTime, !=, chaseTime)) {
        chaseTime = newChaseTime;
        if (!isSeekInProgress) {
            [self trySeekToChaseTime];
        }
    }
    [self onVideoPlayerProgressUpdate];
}
- (void)trySeekToChaseTime{
    if (_player.currentItem.status == AVPlayerItemStatusUnknown) {
        
    } else if (_player.currentItem.status == AVPlayerItemStatusReadyToPlay){
        [self actuallySeekToTime];
    }
}

- (void)actuallySeekToTime{
    isSeekInProgress = YES;
    CMTime seekTimeInProgress = chaseTime;
    [self.player seekToTime:seekTimeInProgress
            toleranceBefore:kCMTimeZero
             toleranceAfter:kCMTimeZero
          completionHandler:^(BOOL finished) {
              if (CMTIME_COMPARE_INLINE(seekTimeInProgress, ==, chaseTime)) {
                  isSeekInProgress = NO;
              } else {
                  [self trySeekToChaseTime];
              }
          }];
}

效果:


原创文章转载需获授权并注明出处
请在后台留言联系转载

相关文章

  • AVPlayerde 无缝快进和倒放.

    最近研究一个AVPlayer seekTime方法的 问题.这个方法虽然可以跳到指定的帧,但是如果你用拖动框去调...

  • AVFoundation AVassetReader 和 AVA

    AVFoundation 教你如何处理混音,拼接,消音,快进倒放等功能! 如果你对于AVfoundation如何处...

  • 诗歌《最后的胶片》

    碟带倒放 齿轮刻出你容颜 年轻又热烈 岁月快进 黄昏慢放你笑眼 薄情却缱绻 音符跳跃 情丝牵你我心悸 破碎又缠绵 ...

  • AVFoundation 教你如何处理混音,拼接,消音,快进倒放

    第一 对于AVFoundation的理解 我们现在原生上对于视频的处理都是在于avfoundation的框架下完成...

  • 【041 枪 拾荒 梦呓】初生的浪漫

    习惯是从生命开始倒数的 不是倒放,不能快进 直到所有的弓箭都变成了枪膛里 的轨道 而弹夹成为了拾荒者 为数不多的归...

  • 关心是因为喜欢,因为喜欢所以才关心

    人生是一部无法倒放亦无法快进的回旋曲,我们只能一个音符一个音符的随着节奏慢慢行走。记下途中优美动听的旋律...

  • 倒放历史

    在历史阅读中有个名词叫“倒放历史”(hindsight prejudice,来源:有哪些我们习以为常,其实似是而非...

  • 倒放(诗)

    愿你们 不乱于心,不困于情,不畏将来,不念过往。 ——...

  • 2022-08-15

    秋是倒放的春天。

  • 开挂和快进

    平常有经常玩游戏或是喜欢刷影视剧的吗?如果有?你最喜欢的角色是什么?如果没有?羡慕你的家庭生活,一定很幸福、很有趣...

网友评论

  • Zszen:rate设置成-1就可以倒放,你里面只是提到提取回放帧
  • 7d747130efea:希望大佬能给一个Demo
  • 7d747130efea:大佬,求指导如何对编辑的视频的选择区域做快进和慢放处理。
    7d747130efea:@Y_Swordsman 使用scaleTimeRange方法可以改变视频轨道的播放速度,但是音轨改变的话就没有声音了,请问如何解决呢?
    7d747130efea:@Y_Swordsman 好的哈 我去看看!! 谢谢大哥
    Y_Swordsman:可以对轨道 操作
    - (void)scaleTimeRange:(CMTimeRange)timeRange toDuration:(CMTime)duration;
    使用这个方法

本文标题:AVPlayerde 无缝快进和倒放.

本文链接:https://www.haomeiwen.com/subject/mzmwkftx.html