解决播放器(基于AVPlayer)滑竿颤抖问题

由于苹果对MP的弃用,现在做的播放器都开始采用了AVPlayer。AVPlayer给了开发者们极大的灵活性去添加控件实现对用的方法,也带来了一些比较麻烦的问题,比如滑动滑竿时滑竿颤抖,这个在一些上架的App上很常见。

可能每个人的状况不一样,先交代一下我自定义控件的状况:
进度条用的UISilder,修改了滑块的大小和形状(这个不是重点),拖动滑块时的关键代码如下图:

解决播放器(基于AVPlayer)滑竿颤抖问题_第1张图片
017FCF5F-A083-4088-9263-561B9D43A823.png

如果你的代码原理和我一样,那么咱们遇到的情况就是一样的。

我分析的原因如下:
滑竿被拖动时不停触发seekToTime 这个方法, 这个方法完成时一个回调,这个回调相对于滑竿拖动是有延迟的,也就是播放器锁定下一次开始播放的位置跟不上滑竿变化的速度,而每一次的回调又必须执行(执行时触发观察者方法重新为滑竿进度赋值),所以此时会产生冲突。

解决方式有很多种,我想了个比较简单的,代码修改起来比较少的,思路大致是这样的:

自定义一个UISlier,添加一个属性BOOL isDraging,当开始拖动的时候isDraging = YES,这时候即使seekToTime回调了,只要isDraging还是YES(说明还在拖动),就不让播放器播放,当为NO时(说明手离开了滑竿不再拖动了),开始让播放器播放;

.m文件需要重写这两个方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    self.isTouch = YES;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    self.isTouch = NO;
}

第一个方法中将属性置为YES;
第二个方法中将属性置为NO;
在拖动滑竿那个方法中添加判断如下:

解决播放器(基于AVPlayer)滑竿颤抖问题_第2张图片
1A53952E-28A4-4EC2-BB4B-CF38869EC27B.png

我测试的是没有问题的,大家可以测试一下这个方法,如果有更好的方法欢迎分享。

个人原创,转载请注明出处,谢谢。

你可能感兴趣的:(解决播放器(基于AVPlayer)滑竿颤抖问题)