播放器轮子制造回顾|项目复盘(一)

简介: 播放器轮子制造回顾|项目复盘

一、项目简介:


最近利用闲暇时间来重构一下之前的播放器,这次的主要升级功能如下:


  • 支持动态切换内核
  • 支持音/视频播放,midi文件播放
  • 支持在线播放/本地播放
  • 支持后台播放,音频提取播放
  • 支持视频边下边播,分片下载播放存储
  • 支持断点续载续播,下次直接优先从缓冲读取播放
  • 支持缓存管理,清除时间段缓存
  • 支持试看,自动跳过片头
  • 支持记录上次播放时间
  • 支持自动播放,自动连续播放
  • 支持随机/重复/顺序播放
  • 支持重力感应,全屏/半屏切换
  • 支持基本手势操作,进度音量等
  • 支持切换不同分辨率视频
  • 支持直播流媒体播放

视频支持格式:mp4、m3u8、wav、avi

音频支持格式:midi、mp3、


二、项目背景:


1.png

1.png

在很早之前写个一个播放器架子,但是这个架子只是当初简单的实现播放处理,那么这段时间事情不多,所以就利用闲暇时间来升级重构一下,其实网上关于播放器的轮子也非常多ZFPlayer、KRVideoPlayer、SJVideoPlayer


这些轮子都很优秀,所以在制作的时候有借鉴参考


然后慢慢完善实现一款可以高度自定义并且支持动态切换内核的播放器壳子,支持边下边播边存,续播续传功能,基本手势播放等等功能


至于流媒体暂时网上也没发现有什么可以实现边下边播边存的方案,我其实这里有这样一个思路,可以利用搭建本地服务器来处理,先将分片数据下载到本地,然后播放这样也就只需要用户一次网络数据下载,等空闲时间我再来慢慢实现

目前已初步实现KJAVPlyaer、KJIJKPlayer、KJMIDIPlayer三种内核,

image.png

KJAVPlyaer基于AVPlayer封装使用

KJIJKPlayer基于b站IJKMediaFramework封装使用

KJMIDIPlayer基于AudioToolBox封装使用


三、实践过程:


技术选型:项目目前主要还是基于AVPlayer的灵活封装使用,然后也有对Bilibili开源IJKMediaFramework的使用处理

基于AVPlayer实现边下边播边存功能,目前很多网上资料基本都是基于唱吧KTVHTTPCache来实现,而本文则是采用NSURLSession封装的下载器,在结合文件写入NSFileHandle来实现,然后将信息存储在数据库


四、模块介绍


主要就是分为以下几大模块,


KJBaseFunctionPlayer播放器协议


所有播放器壳子都是基于该基础做处理,提取公共部分

API & Property 类型 功能
delegate Property 委托代理
requestHeader Property 视频请求头
roregroundResume Property 返回前台继续播放
backgroundPause Property 进入后台暂停播放
autoPlay Property 是否开启自动播放
speed Property 播放速度
volume Property 播放音量
cacheTime Property 缓存达到多少秒才能播放
skipHeadTime Property 跳过片头
timeSpace Property 时间刻度
kVideoTotalTime Property 获取视频总时长
kVideoURLFromat Property 获取视频格式
kVideoTryLookTime Property 免费试看时间和试看结束回调
videoURL Property 视频地址
localityData Property 是否为本地资源
isPlaying Property 是否正在播放
currentTime Property 当前播放时间
ecode Property 播放失败
kVideoAdvanceAndReverse Property 快进或快退
shared Property 单例属性
kj_sharedInstance Instance 创建单例
kj_attempDealloc Instance 销毁单例
kj_play Instance 准备播放
kj_replay Instance 重播
kj_resume Instance 继续
kj_pause Instance 暂停
kj_stop Instance 停止


KJPlayerDelegate委托代理


/* 当前播放器状态 */
- (void)kj_player:(KJBasePlayer*)player state:(KJPlayerState)state;
/* 播放进度 */
- (void)kj_player:(KJBasePlayer*)player currentTime:(NSTimeInterval)time;
/* 缓存进度 */
- (void)kj_player:(KJBasePlayer*)player loadProgress:(CGFloat)progress;
/* 播放错误 */
- (void)kj_player:(KJBasePlayer*)player playFailed:(NSError*)failed;


KJBaseUIPlayer播放器协议


播放器UI相关协议

API & Property 类型 功能
playerView Property 播放器载体
background Property 背景颜色
placeholder Property 占位图
videoGravity Property 视频显示模式
kVideoSize Property 获取视频尺寸大小
kVideoTimeScreenshots Property 获取当前截屏
kVideoPlaceholderImage Property 子线程获取封面图,图片会存储在磁盘
kj_startAnimation Instance 圆圈加载动画
kj_stopAnimation Instance 停止动画
kj_displayHintText: Instance 支持富文本提示的文本框,零秒表示不自动消失
kj_displayHintText:time:max:position: Instance 支持富文本提示的文本框,零秒表示不自动消失
kj_hideHintText Instance 隐藏提示文字


KJBasePlayerView播放器视图基类,播放器控件父类


只要子控件没有涉及到手势交互,我均采用Layer的方式来处理,然后根据zPosition来区分控件的上下层级关系

/* 控件位置和大小发生改变信息通知 */
extern NSString *kPlayerBaseViewChangeNotification;
/* 控件位置和大小发生改变key */
extern NSString *kPlayerBaseViewChangeKey;
@protocol KJPlayerBaseViewDelegate;
@interface KJBasePlayerView : UIImageView
/* 委托代理 */
@property (nonatomic,weak) id <KJPlayerBaseViewDelegate> delegate;
/* 主色调,默认白色 */
@property (nonatomic,strong) UIColor *mainColor;
/* 副色调,默认红色 */
@property (nonatomic,strong) UIColor *viceColor;
/* 支持手势,支持多枚举 */
@property (nonatomic,assign) KJPlayerGestureType gestureType;
/* 长按执行时间,默认1秒 */
@property (nonatomic,assign) NSTimeInterval longPressTime;
/* 操作面板自动隐藏时间,默认2秒然后为零表示不隐藏 */
@property (nonatomic,assign) NSTimeInterval autoHideTime;
/* 操作面板高度,默认60px */
@property (nonatomic,assign) CGFloat operationViewHeight;
/* 当前操作面板状态 */
@property (nonatomic,assign,readonly) BOOL displayOperation;
/* 隐藏操作面板时是否隐藏返回按钮,默认yes */
@property (nonatomic,assign) BOOL isHiddenBackButton;
/* 小屏状态下是否显示返回按钮,默认yes */
@property (nonatomic,assign) BOOL smallScreenHiddenBackButton;
/* 全屏状态下是否显示返回按钮,默认no */
@property (nonatomic,assign) BOOL fullScreenHiddenBackButton;
/* 是否开启自动旋转,默认yes */
@property (nonatomic,assign) BOOL autoRotate;
/* 是否为全屏,名字别乱改后面kvc有使用 */
@property (nonatomic,assign) BOOL isFullScreen;
/* 当前屏幕状态,名字别乱改后面kvc有使用 */
@property (nonatomic,assign,readonly) KJPlayerVideoScreenState screenState;
/* 当前屏幕状态发生改变 */
@property (nonatomic,copy,readwrite) void (^kVideoChangeScreenState)(KJPlayerVideoScreenState state);
/* 返回回调 */
@property (nonatomic,copy,readwrite) void (^kVideoClickButtonBack)(KJBasePlayerView *view);
/* 提示文字面板属性,默认最大宽度250px */
@property (nonatomic,copy,readonly) void (^kVideoHintTextInfo)(void(^)(KJPlayerHintInfo *info));
#pragma mark - 控件
/* 快进快退进度控件 */
@property (nonatomic,strong) KJPlayerFastLayer *fastLayer;
/* 音量亮度控件 */
@property (nonatomic,strong) KJPlayerSystemLayer *vbLayer;
/* 加载动画层 */
@property (nonatomic,strong) KJPlayerLoadingLayer *loadingLayer;
/* 文本提示框 */
@property (nonatomic,strong) KJPlayerHintTextLayer *hintTextLayer;
/* 顶部操作面板 */
@property (nonatomic,strong) KJPlayerOperationView *topView;
/* 底部操作面板 */
@property (nonatomic,strong) KJPlayerOperationView *bottomView;
/* 返回按钮 */
@property (nonatomic,strong) KJPlayerButton *backButton;
/* 锁屏按钮 */
@property (nonatomic,strong) KJPlayerButton *lockButton;
/* 播放按钮 */
@property (nonatomic,strong) KJPlayerButton *centerPlayButton;
#pragma mark - method
/* 隐藏操作面板,是否隐藏返回按钮 */
- (void)kj_hiddenOperationView;
/* 显示操作面板 */
- (void)kj_displayOperationView;
/* 取消收起操作面板,可用于滑动滑杆时刻不自动隐藏 */
- (void)kj_cancelHiddenOperationView;


相关文章
|
7月前
|
自然语言处理 安全
线下陪玩游戏系统开发多语言/海外版/成熟技术/方案项目/源码功能
Continuing to develop an offline companion game system may involve the following aspects:
|
人工智能 数据挖掘 物联网
NFT/Stepn/Jogger跑鞋链游铸造合成项目系统开发成熟稳定版/开发案例/规则玩法/源码平台
  NFT跑鞋链游项目则是将区块链技术应用到跑鞋领域中去的一个创新项目。通过NFT跑鞋链游项目,跑者可以将自己的跑鞋进行数字资产化,并在游戏中进行买卖和交换。这种数字资产化的跑鞋不仅可以让跑者更好地了解自己的跑鞋价值,还可以为跑者带来更多的社交和娱乐价值。
|
存储 算法 安全
Jogger跑鞋链游开发详情丨Jogger链游跑鞋系统开发方案详细/项目逻辑/功能分析/案例设计/源码平台
  区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久、不可逆向修改的记录。某种意义上说,区块链技术是互联网时代一种新的“信息传递”技术,
|
存储 安全 算法
TechFinger游戏搬砖平台系统开发方案详细丨TechFinger搬砖游戏系统开发案例项目/源码功能/成熟技术
去中心化:以分布式网络为基础结构,对数据进行验证、记账、存储、维护和传输等操作,利用纯数学方法建立节点之间的交互信任关系,进而形成去中心化、可信任的分布式系统;
|
缓存 数据库
播放器轮子制造回顾|项目复盘(二)
播放器轮子制造回顾|项目复盘
 播放器轮子制造回顾|项目复盘(二)
|
5G 区块链 vr&ar
赛车链游DAPP开发丨赛车链游系统开发实现技术方案丨赛车链游源码部署
 在分布式数字身份系统中,用户身份信息管理是去中心化的,因此也可以避免被随意地泄露和篡改。基于这样的数字身份系统,个体在互联网空间中交流的基础是自己的身份数据,而不需要依赖于特定的第三方平台。而从平台的维度来看,分布式数字身份也更有利于平台之间的平等合作,共同为用户提供服务。
赛车链游DAPP开发丨赛车链游系统开发实现技术方案丨赛车链游源码部署
|
测试技术 iOS开发 Python
热饭的测开成果盘点第二十六期:IOS自动化平台
热饭的测开成果盘点第二十六期:IOS自动化平台
热饭的测开成果盘点第二十六期:IOS自动化平台
|
测试技术 Android开发
热饭的测开成果盘点第二十七期:安卓自动化平台
热饭的测开成果盘点第二十七期:安卓自动化平台
热饭的测开成果盘点第二十七期:安卓自动化平台
|
人工智能 自然语言处理 测试技术
热饭的测开成果盘点第十九期:移动端自动化智能平台
本期介绍的是移动端app智能架构平台,效果和上期一样,也是直接根据用例 来直接执行,它的初衷是可以简单的对我们测试环境几千条用例全部自动执行的框架。在具体稳定和速度上可能不如原始写法,但是对付这种上千条的大需求,是有奇效的。
热饭的测开成果盘点第十九期:移动端自动化智能平台
|
测试技术
热饭的测开成果盘点第二十一期:埋点自动化测试平台
本期介绍的是一款由旧移动测试平台改造的新测试平台。具体样式其实都和之前差不多,唯一不同的是增加了自动抓包和判断请求体。
热饭的测开成果盘点第二十一期:埋点自动化测试平台