前言

很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构。旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能。不想看文字的请自行下载代码------>>>CLPlayer

旧版本 VS 重构版本

1.新版本使用Swift,旧版本使用Objective-C

2.新版本采用自定义转场实现全屏,旧版本使用旋转屏幕

3.新版本不需要手动销毁播放器

4.新版本修复了老版本遗留bug

5.新版本降低了代码耦合性

6.新版本增加了倍数播放,切换填充模式

7.新版本提供更丰富的API

8.新版本适配了iPhone X

9.新版本移除了状态栏相关配置

效果

功能

  • [x] 支持全屏模式、小屏模式
  • [x] 支持跟随手机自动旋转
  • [x] 支持本地视频、网络URL
  • [x] 支持UITableView
  • [x] 支持UICollectionView
  • [x] 支持手势改变屏幕的亮度(屏幕左半边)
  • [x] 支持手势改变音量大小(屏幕右半边)
  • [x] 支持拖动UISlider快进快退
  • [x] 支持iPhone X留海屏
  • [x] 支持倍速播放(0.5X、1.0X、1.25X、1.5X、1.75X、2X)
  • [x] 支持动态改变播放器的填充模式(适应、拉伸、填充)
  • [x] 支持cocoapods

接入指南

项目必须支持全屏,建议将屏幕支持方向交由当前显示的控制器自行管理。

项目支持全屏方案

1.先勾选支持方向,只保留portrait,保证APP启动不会横屏

2.AppDelegate中重写func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {}方法

func application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -> UIInterfaceOrientationMask {
return .allButUpsideDown
}

3.在父类中重写屏幕控制相关方法

UITabBarController

// 是否支持自动转屏
override var shouldAutorotate: Bool {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }
return navigationController.topViewController?.shouldAutorotate ?? false
} // 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }
return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait
} // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }
return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UINavigationController

// 是否支持自动转屏
override var shouldAutorotate: Bool {
return topViewController?.shouldAutorotate ?? false
} // 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return topViewController?.supportedInterfaceOrientations ?? .portrait
} // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}

UIViewController

// 是否支持自动转屏
override var shouldAutorotate: Bool {
return true
} // 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
} // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .portrait
}

4.部分页面需要支持多方向

在对应控制器中重写以下方法

override var shouldAutorotate: Bool {
return true
} // 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .allButUpsideDown
}

基础配置

public struct CLPlayerConfigure {
/// 顶部工具条隐藏风格
public enum CLPlayerTopBarHiddenStyle {
/// 小屏和全屏都不隐藏
case never
/// 小屏和全屏都隐藏
case always
/// 小屏隐藏,全屏不隐藏
case onlySmall
} /// 自动旋转
public var isAutoRotate = true
/// 手势控制
public var isGestureInteractionEnabled = true
/// 是否显示更多面板
public var isShowMorePanel = true
/// 顶部工具条隐藏风格
public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
/// 工具条自动消失时间
public var autoFadeOut: TimeInterval = 5
/// 默认拉伸方式
public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
/// 顶部工具条背景颜色
public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
/// 底部工具条背景颜色
public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
/// 进度条背景颜色
public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)
/// 缓冲条缓冲进度颜色
public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)
/// 进度条播放完成颜色
public var progressFinishedColor: UIColor = .white
/// 转子背景颜色
public var loadingBackgroundColor: UIColor = .white
/// 返回按钮图片
public var backImage: UIImage?
/// 更多按钮图片
public var moreImage: UIImage?
/// 播放按钮图片
public var playImage: UIImage?
/// 暂停按钮图片
public var pauseImage: UIImage?
/// 进度滑块图片
public var sliderImage: UIImage?
/// 最大化按钮图片
public var maxImage: UIImage?
/// 最小化按钮图片
public var minImage: UIImage?
/// 封面图片
public var maskImage: UIImage?
}

总结

本次重构为Swift第一版,后续会持续更新,定制化开发请自行参考CLPlayer修改 , 如果喜欢,欢迎star。

参考资料

  1. iOS播放器全屏方案

  2. iOS状态栏

  3. iOS播放器全屏旋转实现

  4. iOS横竖屏旋转解决方案 - Swift

  5. iOS视频旋转探究

  6. iOS屏幕旋转的解决方案

使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本的更多相关文章

  1. Android中使用WebView实现全屏切换播放网页视频

    首先写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  2. 自定义一个全屏的AlertDialog。

    ........... final MyDialog dialog = new MyDialog(this); LayoutInflater inflater = getLayoutInflater( ...

  3. video 全屏,播放,隐藏控件。

    requestFullscreen全屏具体实现 1.进入全屏 function full(ele) { if (ele.requestFullscreen) { ele.requestFullscre ...

  4. IOS写一个能够支持全屏的WebView

    这样来写布局 一个TitleView作为顶部搜索栏: @implementation TitleView - (id)initWithFrame:(CGRect)frame { self = [sup ...

  5. .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码

    .avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...

  6. 全平台网页播放器兼容H5与Flash还带播放列表

    许久不发文了,2018年第一篇文章,写点干货--关于网页播放器的问题.嗯,实际上我是在52破解首发的,当做新人贴. 目前来说,网页播放器不少,随便找找都能找到一大堆,然而好用的就那么几个,比如ckpl ...

  7. android全功能音乐播放器、基于MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的综合应用、图片滤镜处理等源码

    Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...

  8. 支持多种格式的播放器js代码

    FLV需要播放器,其它视频格式直接插入相应的代码即可. ------------------------------------- /**   *视频播放 by zhensheng@   *参数说明  ...

  9. Android 使WebView支持HTML5 Video(全屏)播放的方法

    http://blog.csdn.net/zrzlj/article/details/8050633  1)需要在AndroidManifest.xml文件中声明需要使用HardwareAcceler ...

随机推荐

  1. linux RPM/YUM包管理

    linux RPM/YUM包管理 目录 linux RPM/YUM包管理 RPM RPM包管理 查询rpm包 卸载rpm包 安装rpm包 YUM 查看yum服务器是否有需要安装的软件 下载安装指定的y ...

  2. Redis | 第11章 服务器的复制《Redis设计与实现》

    目录 前言 1. 旧版复制功能的实现 1.1 同步与命令传播 1.2 旧版复制功能的缺陷 2. 新版复制功能的实现 2.1 部分重同步的实现原理 3. PSYNC 命令的实现 4. 复制的详细步骤 4 ...

  3. Spark基础:(五)Spark编程进阶

    共享变量 (1)累加器:是用来对信息进行聚合的,同时也是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执 ...

  4. Hbase(一)【入门安装及高可用】

    目录 一.Zookeeper正常部署 二.Hadoop正常部署 三.Hbase部署 1.下载 2.解压 3.相关配置 4.分发文件 5.启动.关闭 6.验证 四.HMaster的高可用 一.Zooke ...

  5. android studio 使用 aidl(一)基础用法

    最近公司需要开发一个项目用的到aidl,之前研究过eclipse版本的,但是好久了一直没用,现在需要捡起来,但是现在都用android studio了,所以查了下资料 都不是很全,我在这里总结一下,方 ...

  6. NSURLSessionDownloadTask实现大文件下载

    - 4.1 涉及知识点(1)使用NSURLSession和NSURLSessionDownload可以很方便的实现文件下载操作 第一个参数:要下载文件的url路径 第二个参数:当接收完服务器返回的数据 ...

  7. VScode 使用 CMake 入门

    参考 CMake 入门实战 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . 执行命令 cmake PA ...

  8. Linux系统下部署eleasticsearch+kibana

    1.官网下载eleasticsearch和kibana,两个版本应安装一致,否则会出现kibana连接不上eleasticsearch的情况(这里我以6.3.1为例) eleasticsearch的下 ...

  9. 莫烦python教程学习笔记——总结篇

    一.机器学习算法分类: 监督学习:提供数据和数据分类标签.--分类.回归 非监督学习:只提供数据,不提供标签. 半监督学习 强化学习:尝试各种手段,自己去适应环境和规则.总结经验利用反馈,不断提高算法 ...

  10. 修复Apache Log4j任意代码执行漏洞安全风险通告

    2021年12月10日 0x01漏洞背景 Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了 ...