{"id":13568863,"url":"https://github.com/JmoVxia/CLPlayer","last_synced_at":"2025-04-04T05:30:40.341Z","repository":{"id":49780790,"uuid":"72847721","full_name":"JmoVxia/CLPlayer","owner":"JmoVxia","description":"自定义视频播放器","archived":false,"fork":false,"pushed_at":"2024-08-12T08:55:06.000Z","size":111271,"stargazers_count":443,"open_issues_count":2,"forks_count":84,"subscribers_count":11,"default_branch":"master","last_synced_at":"2024-10-12T21:33:13.169Z","etag":null,"topics":["avplayer","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JmoVxia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-04T12:56:14.000Z","updated_at":"2024-09-20T13:45:25.000Z","dependencies_parsed_at":"2023-11-13T02:26:29.782Z","dependency_job_id":"5160687e-6023-4cc4-aa22-b7cc9c3bcacb","html_url":"https://github.com/JmoVxia/CLPlayer","commit_stats":{"total_commits":327,"total_committers":4,"mean_commits":81.75,"dds":0.3027522935779816,"last_synced_commit":"35039f097bf24144c4c2652bc24f2434d542ed19"},"previous_names":[],"tags_count":39,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JmoVxia%2FCLPlayer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JmoVxia%2FCLPlayer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JmoVxia%2FCLPlayer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JmoVxia%2FCLPlayer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JmoVxia","download_url":"https://codeload.github.com/JmoVxia/CLPlayer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223099958,"owners_count":17087380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avplayer","swift"],"created_at":"2024-08-01T14:00:32.690Z","updated_at":"2024-11-05T01:31:04.336Z","avatar_url":"https://github.com/JmoVxia.png","language":"Swift","funding_links":[],"categories":["Objective-C","OOM-Leaks-Crash","Swift"],"sub_categories":["Player"],"readme":"# 前言\n\n    很早之前开源了一个简单的视频播放器，由于年久失修，效果惨目忍睹，最近特意花时间对其进行了深度重构。旧版本后期不再维护，新版本使用`Swift`实现，后续会增加更多功能。不想看文字的请自行下载代码------\u003e\u003e\u003e[CLPlayer](https://github.com/JmoVxia/CLPlayer)\n# 旧版本 VS 重构版本\n\n**1.新版本使用`Swift`，旧版本使用`Objective-C`**\n\n**2.新版本采用自定义转场实现全屏，旧版本使用旋转屏幕**\n\n**3.新版本不需要手动销毁播放器**\n\n**4.新版本修复了老版本遗留bug**\n\n**5.新版本降低了代码耦合性**\n\n**6.新版本增加了倍数播放，切换填充模式**\n\n**7.新版本提供更丰富的API**\n\n**8.新版本适配了iPhone X**\n\n**9.新版本移除了状态栏相关配置**\n\n# 效果\n\n![效果图](https://upload-images.jianshu.io/upload_images/1979970-3f35995fbe988a91.gif?imageMogr2/auto-orient/strip)\n\n![全屏](https://upload-images.jianshu.io/upload_images/1979970-46f701b4f1d654ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![控制面板](https://upload-images.jianshu.io/upload_images/1979970-dd643aea0e8db12f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![UITableView](https://upload-images.jianshu.io/upload_images/1979970-6eaee76837eb46aa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![UICollectionView](https://upload-images.jianshu.io/upload_images/1979970-7d239b30f5b91d72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n# 功能\n\n- [x] 支持Autolayout、UIStackView、Frame\n- [x] 支持全屏模式、小屏模式\n- [x] 支持跟随手机自动旋转\n- [x] 支持本地视频、网络`URL`\n- [x] 支持`UITableView`\n- [x] 支持`UICollectionView`\n- [x] 支持手势改变屏幕的亮度（屏幕左半边）\n- [x] 支持手势改变音量大小（屏幕右半边）\n- [x] 支持拖动`UISlider`快进快退\n- [x] 支持`iPhone X`留海屏\n- [x] 支持倍速播放（`0.5X、1.0X、1.25X、1.5X、1.75X、2X`）\n- [x] 支持动态改变播放器的填充模式（`适应、拉伸、填充`）\n- [x] 支持`cocoapods`\n\n# 接入指南\n\n**项目必须支持全屏，建议将屏幕支持方向交由当前显示的控制器自行管理。**\n#### 项目支持全屏方案\n\n#### **1.先勾选支持方向，只保留`portrait`，保证APP启动不会横屏**\n\n![image.png](https://upload-images.jianshu.io/upload_images/1979970-e805d44b28ba55c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n#### **2.`AppDelegate`中重写`func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -\u003e UIInterfaceOrientationMask {}`方法**\n\n```swift\nfunc application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -\u003e UIInterfaceOrientationMask {\n        return .allButUpsideDown\n}\n```\n\n#### **3.在父类中重写屏幕控制相关方法**\n\n```swift\n// 是否支持自动转屏\noverride var shouldAutorotate: Bool {\n    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }\n    return navigationController.topViewController?.shouldAutorotate ?? false\n}\n\n// 支持哪些屏幕方向\noverride var supportedInterfaceOrientations: UIInterfaceOrientationMask {\n    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }\n    return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait\n}\n\n// 默认的屏幕方向（当前ViewController必须是通过模态出来的UIViewController（模态带导航的无效）方式展现出来的，才会调用这个方法）\noverride var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {\n    guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }\n    return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait\n}\n```\n`UINavigationController`\n\n```swift\n// 是否支持自动转屏\noverride var shouldAutorotate: Bool {\n    return topViewController?.shouldAutorotate ?? false\n}\n\n// 支持哪些屏幕方向\noverride var supportedInterfaceOrientations: UIInterfaceOrientationMask {\n    return topViewController?.supportedInterfaceOrientations ?? .portrait\n}\n\n// 默认的屏幕方向（当前ViewController必须是通过模态出来的UIViewController（模态带导航的无效）方式展现出来的，才会调用这个方法）\noverride var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {\n    return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait\n}\n```\n`UIViewController`\n```swift\n// 是否支持自动转屏\noverride var shouldAutorotate: Bool {\n    return false\n}\n\n// 支持哪些屏幕方向\noverride var supportedInterfaceOrientations: UIInterfaceOrientationMask {\n    return .portrait\n}\n\n// 默认的屏幕方向（当前ViewController必须是通过模态出来的UIViewController（模态带导航的无效）方式展现出来的，才会调用这个方法）\noverride var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {\n    return .portrait\n}\n```\n#### **4.部分页面需要支持多方向**\n\n在对应控制器中重写以下方法\n\n```swift\noverride var shouldAutorotate: Bool {\n    return true\n}\n\n// 支持哪些屏幕方向\noverride var supportedInterfaceOrientations: UIInterfaceOrientationMask {\n    return .allButUpsideDown\n}\n```\n\n#### 基础配置\n\n```swift\npublic struct CLPlayerConfigure {\n    /// 顶部工具条隐藏风格\n    public enum CLPlayerTopBarHiddenStyle {\n        /// 小屏和全屏都不隐藏\n        case never\n        /// 小屏和全屏都隐藏\n        case always\n        /// 小屏隐藏，全屏不隐藏\n        case onlySmall\n    }\n\n    /// 自动旋转\n    public var isAutoRotate = true\n    /// 手势控制\n    public var isGestureInteractionEnabled = true\n    /// 是否显示更多面板\n    public var isShowMorePanel = true\n    /// 顶部工具条隐藏风格\n    public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall\n    /// 工具条自动消失时间\n    public var autoFadeOut: TimeInterval = 5\n    /// 默认拉伸方式\n    public var videoGravity: AVLayerVideoGravity = .resizeAspectFill\n    /// 顶部工具条背景颜色\n    public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)\n    /// 底部工具条背景颜色\n    public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)\n    /// 进度条背景颜色\n    public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)\n    /// 缓冲条缓冲进度颜色\n    public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)\n    /// 进度条播放完成颜色\n    public var progressFinishedColor: UIColor = .white\n    /// 转子背景颜色\n    public var loadingBackgroundColor: UIColor = .white\n    /// 返回按钮图片\n    public var backImage: UIImage?\n    /// 更多按钮图片\n    public var moreImage: UIImage?\n    /// 播放按钮图片\n    public var playImage: UIImage?\n    /// 暂停按钮图片\n    public var pauseImage: UIImage?\n    /// 进度滑块图片\n    public var sliderImage: UIImage?\n    /// 最大化按钮图片\n    public var maxImage: UIImage?\n    /// 最小化按钮图片\n    public var minImage: UIImage?\n    /// 封面图片\n    public var maskImage: UIImage?\n}\n```\n# 总结\n\n    本次重构为`Swift`第一版，后续会持续更新，定制化开发请自行参考[CLPlayer](https://github.com/JmoVxia/CLPlayer)修改 ， 如果喜欢，欢迎star。\n\n# 参考资料\n\n1.  [iOS播放器全屏方案](https://www.jianshu.com/p/182f6d1e7b04)\n\n2.  [iOS状态栏](https://www.justisit.com/15626010144789.html)\n\n3.  [iOS播放器全屏旋转实现](https://www.jianshu.com/p/84a148e58fc8)\n\n4.  [iOS横竖屏旋转解决方案 - Swift](https://www.jianshu.com/p/539b265bcb5d)\n\n5.  [iOS视频旋转探究](https://drinking.github.io/iOS-video-rotation)\n\n6.  [iOS屏幕旋转的解决方案](https://www.jianshu.com/p/c973817d40c8)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJmoVxia%2FCLPlayer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FJmoVxia%2FCLPlayer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJmoVxia%2FCLPlayer/lists"}