swift4.0实现视频播放、屏幕旋转、倍速播放、手势调节及锁屏面

2020-01-09 00:09:32王旭

1.单利初始化


self.playerView = MPlayerView.shared.initWithFrame(frame: self.view.frame, videoUrl: videoUrl, type: "VIDEO")

2.init 初始化


self.playerView = MPlayerView().initWithFrame(frame: CGRect.init(x: 0, y: 0, width: Screen_width, height: Screen_width * 9/16), videoUrl: videoUrl, type: "VIDEO")

手势滑动及注意事项

由于swift里面有严格的类型检查,就比如在做手势滑动的时候,手势刚开始滑动的时候肯定需要记录一下当前播放器的位置我在项目中是定义的sumTime属性是一个CMTime类型,如果在OC里大可不必这样,来看一下swift与OC代码的区别

swift写法


/// 给sumTime初值
let time = self.player?.currentTime()
self.sumTime = CMTimeMake((time?.value)!, (time?.timescale)!)

OC写法


// 给sumTime初值
CMTime time = self.player.currentTime;
self.sumTime = time.value/time.timescale;

滑动的距离是一个Double类型,而self.sumTime是CMTime类型,俩者肯定不能想加算出结束滑动的距离,所以将double类型转换成CMTime类型用以下方法:


CMTime.init(seconds: Double.init(value/200), preferredTimescale: CMTimeScale(NSEC_PER_SEC))

如果是OC的话直接括号强转类型即可实现。

知道滑动的距离和记录滑动前的距离俩者想加即是当前位置,转化成CMTime类型:


self.sumTime = CMTimeAdd(self.sumTime!, addend)

手势是滑动了,但是进度条也是要跟着一起滑动的,有人说我把进度条刷新放到player的代理里面,手势滑动完只需要把时间传给播放器,播放器根据当前时间和总时间去更新进度条,这样做也对,但是有一点就是,如果网速不好,手势已经滑动到5分钟了,而进度条还停留在1分钟的地方,播放器缓存完毕了,进度条会瞬间跳到5分钟,从而造成卡顿的假象体验也不是很好,所以解决这个方法是手势滑动的时候也更新进度条,但是手势滑动的时候都是CMTime类型,怎么转成Float类型,因为slider?.value是float类型。可以这样:通过CMTimeGetSeconds方法得到一个Float64再通过Float.init方法得到一个float类型,看一下实现:


let sliderTime = CMTimeGetSeconds(self.sumTime!)/CMTimeGetSeconds(totalMovieDuration)
self.slider?.value = Float.init(sliderTime)

想查看整个过程可以看播放器手势添加与创建这一块,我已经用MARK:标记起来了。

设置控制面板信息

在视频播放过程中,对视频的监听是必不可少的,监听播放器状态,播放器缓存...等,由于播放器比较简单,功能较少,刚开始我只监听了status属性,后来我加上来loadedTimeRanges缓存状态,缓存这部分的缓存进度计算我已经实现了,但是没有用到只是简单的打印了一下。