框架整体介绍

功能介绍

KJPlayer 是一款视频播放器,AVPlayer的封装,继承UIView

1.支持播放网络和本地视频 ☑️

2.播放多种格式mp4 ☑️ m3u8、3gp、mov等等暂未完成

3.视频边播边下,缓存完成视频保存本地 ☑️

4.缓存离线观看 ☑️

5.重力感应切换横竖屏 ☑️

6.手势滑动改变播放进度和音量和亮度 ☑️

7.视频支持播放完之后播放下一集 ☑️

8.随机播放、顺序播放、重复播放 ☑️

9.小窗口播放、锁定控制面板等等

10.缓存管理、清除长时间不再观看的视频

11.免费试看几分钟

12.音频功能

13.音频和视频混合播放

温馨提示

使用第三方库Xcode报错

Cannot synthesize weak property because the current deployment target does not support weak references

可在Podfile文件底下加入下面的代码,'8.0'是对应的部署目标(deployment target) 删除库重新Pod

不支持用weak修饰属性,而weak在使用ARC管理引用计数项目中才可使用

遍历每个develop target,将target支持版本统一设成一个支持ARC的版本

##################加入代码##################

# 使用第三方库xcode报错Cannot synthesize weak property because the current deployment target does not support weak references

post_install do |installer|

installer.pods_project.targets.each do |target|

target.build_configurations.each do |config|

config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] ='8.0'

end

end

end

##################加入代码##################

作者信息

作者其他Pod库

播放器 - KJPlayer是一款视频播放器,AVPlayer的封装,继承UIView

- 支持播放网络和本地视频、播放多种格式

- 视频可以边下边播,把播放器播放过的数据流缓存到本地,下次直接从缓冲读取播放

- 支持拖动、手势快进倒退、增大减小音量、重力感应切换横竖屏等等

pod 'KJPlayer' # 播放器功能区

pod 'KJPlayer/KJPlayerView' # 自带展示界面

实用又方便的Category和一些自定义控件

pod 'KJEmitterView'

pod 'KJEmitterView/Function'#

pod 'KJEmitterView/Control' # 自定义控件

轮播图 - 支持缩放 多种pagecontrol 支持继承自定义样式 自带网络加载和缓存

pod 'KJBannerView' # 轮播图,网络图片加载

菜单控件 - 下拉控件 选择控件

pod 'KJMenuView' # 菜单控件

加载Loading - 多种样式供选择

pod 'KJLoadingAnimation' # 加载控件

Issue

如果您在使用中有好的需求及建议,或者遇到什么bug,欢迎随时issue,我会及时的回复,有空也会不断优化更新这些库

Pod使用方法

pod 'KJPlayer' # 播放器功能区

pod 'KJPlayer/KJPlayerView' # 自带展示界面

更新日志

####版本更新日志:

#### Add 1.0.3

1.增加播放类型功能 重复播放、随机播放、顺序播放、仅播放一次

2.优化提高播放器稳定性和降低性能消耗

3.新增 KJPlayerViewConfiguration 类用来管理设置默认属性

4.完善全屏布局 完善 KJFastView 快进倒退展示区

5.完成手势快进快退、手势改变音量、完成重力感应改变屏幕方向

#### Add 1.0.2

1.完善 KJPlayerView 展示界面

2.修改bug

#### Add 1.0.0

1.第一次提交项目

2.完善 KJPlayer 功能区

效果图

横屏展示效果图:

培训活动-视频全屏

竖屏目前展示效果:

WechatIMG10.jpeg

KJPlayer

KJPlayerTool:主要提供一些播放器的工具 判断是否含有视频轨道 获取视频第一帧图片和总时长等等

KJRequestTask:网络缓存类 网络请求结束的时候,如果数据完整,则把数据缓存到指定的路径,储存起来,如果不完整,则删除缓存的临时文件数据

KJPlayerURLConnection:网络和Player的中转类 把网络请求缓存到本地的临时数据offset和videoLength传递给播放器

功能流程图

1副本.png

代码事例

UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];

button.frame = CGRectMake(0, 0, 120, 30);

button.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2+50);

[button setTitle:@"自带展示区控制器" forState:(UIControlStateNormal)];

button.titleLabel.font = [UIFont systemFontOfSize:12];

button.backgroundColor = UIColor.greenColor;

[self.view addSubview:button];

[button addTarget:self action:@selector(butAction:) forControlEvents:(UIControlEventTouchUpInside)];

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*9/16)];

view.backgroundColor = UIColor.cyanColor;

[self.view addSubview:view];

NSURL *url = [NSURL URLWithString:@"https://mp4.vjshi.com/2018-03-30/1f36dd9819eeef0bc508414494d34ad9.mp4"];

KJPlayer *player = [KJPlayer sharedInstance];

self.player = player;

player.delegate = self;

AVPlayerLayer *playerLayer = [player kj_playerPlayWithURL:url];

[player kj_playerSeekToTime:0];

playerLayer.frame = view.bounds;

[view.layer addSublayer:playerLayer];

委托代理

#pragma mark - KJPlayerDelegate

- (void)kj_player:(nonnull KJPlayer *)player LoadedProgress:(CGFloat)loadedProgress LoadComplete:(BOOL)complete SaveSuccess:(BOOL)saveSuccess {

NSLog(@"Load:%.2f==%d==%d",loadedProgress,complete,saveSuccess);

}

- (void)kj_player:(nonnull KJPlayer *)player Progress:(CGFloat)progress CurrentTime:(CGFloat)currentTime DurationTime:(CGFloat)durationTime {

NSLog(@"Time:%.2f==%.2f==%.2f",progress,currentTime,durationTime);

}

- (void)kj_player:(nonnull KJPlayer *)player State:(KJPlayerState)state ErrorCode:(KJPlayerErrorCode)errorCode {

NSLog(@"State:%ld==%ld",state,errorCode);

}

- (void)butAction:(UIButton*)sender{

PlayViewController *vc = [PlayViewController new];

vc.view.backgroundColor = UIColor.whiteColor;

UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];

nav.navigationBar.hidden = YES;

[self presentViewController:nav animated:YES completion:^{

[self.player kj_playerStop];

}];

}

KJPlayerView

提供一套完整的布局界面,视图属性我全部暴露在外界,这样方便修改和重新布局

直接 pod 'KJPlayer/KJPlayerView' # 自带展示界面

KJPlayerViewConfiguration:配置信息

KJPlayerViewHeader:宏文件

KJLightView:亮度管理

KJFastView:快进倒退管理

展示区代码事例

@interface ViewController ()

@property(nonatomic,strong) KJPlayerView *playerView;

@end

@implementation ViewController

/// 电池状态栏管理

- (BOOL)prefersStatusBarHidden{

if (self.playerView) {

return _playerView.configuration.fullScreen;

}else{

return NO;

}

}

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

[self.view addSubview:self.playerView];

}

- (KJPlayerView*)playerView{

if (!_playerView) {

KJPlayerViewConfiguration *configuration = [[KJPlayerViewConfiguration alloc]init];

configuration.autoHideTime = 0.0;

configuration.playType = KJPlayerPlayTypeOrder;

KJPlayerView *view = [[KJPlayerView alloc] initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*9/16) Configuration:configuration];

_playerView = view;

view.backgroundColor = UIColor.blackColor;

view.delegate = self;

NSString *url = @"https://mp4.vjshi.com/2018-03-30/1f36dd9819eeef0bc508414494d34ad9.mp4";

[view kj_setPlayWithURL:url StartTime:0];

NSArray *temp = @[@"https://mp4.vjshi.com/2018-08-31/3ba67e58deb45fefe7f7d3d16dbf2b16.mp4",

@"https://mp4.vjshi.com/2017-07-02/0cbbf21c6003f7936f4086dd10e7ebf5.mp4",

[NSURL URLWithString:@"https://mp4.vjshi.com/2018-03-30/1f36dd9819eeef0bc508414494d34ad9.mp4"],

];

view.videoUrlTemps = temp;

view.videoIndex = 2;

}

return _playerView;

}

委托代理

#pragma mark - KJPlayerViewDelegate

- (BOOL)kj_PlayerView:(KJPlayerView *)playerView DeviceDirection:(KJPlayerDeviceDirection)direction{

/// 重置电池状态

[self setNeedsStatusBarAppearanceUpdate];

// switch (direction) {

// case KJPlayerDeviceDirectionTop:

// playerView.layer.transform = CATransform3DIdentity;

// break;

// case KJPlayerDeviceDirectionBottom:

// playerView.layer.transform = CATransform3DIdentity;

// break;

// case KJPlayerDeviceDirectionLeft:

// playerView.layer.transform = CATransform3DMakeRotation(-M_PI/2, 0, 0, 1);

// playerView.layer.frame = CGRectMake(0, 0, PLAYER_SCREEN_WIDTH, PLAYER_SCREEN_HEIGHT);

// playerView.playerLayer.frame = playerView.bounds;

// break;

// case KJPlayerDeviceDirectionRight:

// playerView.layer.transform = CATransform3DMakeRotation(M_PI/2, 0, 0, 1);

// playerView.layer.frame = CGRectMake(0, 0, PLAYER_SCREEN_WIDTH, PLAYER_SCREEN_HEIGHT);

// break;

// default:

// break;

// }

return NO;

}

打赏作者

如果你觉得有帮助,还请为我Star

如果在使用过程中遇到Bug,希望你能Issues,我会及时修复

大家有什么需要添加的功能,也可以给我留言,有空我将补充完善

谢谢大家的支持 - -!

救救孩子吧,谢谢各位老板~~~~

ios 边录音边放_iOS 音频视频播放器实现边下载边播放缓存视频相关推荐

  1. ios 边录音边放_iOS开发 - AVPlayer实现流音频边播边存

    边播边下有三套左右实现思路,本文使用AVPlayer + AVURLAsset实现. 概述 1. AVPlayer简介 AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为 ...

  2. ios 边录音边放_iOS开发:AVPlayer实现流音频边播边存

    概述 1. AVPlayer简介AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为一个随身听 AVPlayer的关联类:AVAsset:一个抽象类,不能直接使用,代表一个 ...

  3. html怎样手机播放本地视频播放器,手机优酷怎么播放本地视频 本地文件导入方法...

    优酷下载的视频一般都会是KUX格式,只能使用优酷进行播放,比较霸道,那么反过来优酷是否可以播放本地视频呢?自然是可以的,下面就跟小编了解下吧. 方法一:找到视频选择打开方式 首先在智能手机的文件管理中 ...

  4. android 播放视频链接,如何通过Android视频播放器中的直接链接播放MP4视频?

    我正在制作一个 Android应用程序,我需要通过直接下载链接在Android默认本机视频播放器中播放mp4视频. 要打开Android视频播放器,我使用以下代码 Intent intent = ne ...

  5. Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频

    1.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  6. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成...

    原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页] [源码下载] 与众不同 wi ...

  7. android音频视频播放器

    最近写了一个android简单的音频视频播放器,顺便开源了 1.扫描sdcard的音乐文件并播放 2.歌词同步功能(只能同步到行,因为是lrc格式,如果需要同步到每一个字,类似kogou那样则需要解析 ...

  8. Android 视频播放器 (二):使用MediaPlayer播放视频

    在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...

  9. html5支持4k视频播放器,哪个是最好的4K视频播放器?五个最佳播放软件(个人经验)...

    哪个是最好的4K视频播放器? 4K视频使用什么播放器?这是每个人问得最多的问题. 4K老实决定与您分享播放4K视频的经验,并推荐几种常用的4K视频播放器. ▌播放软件: PowerDVD ▌推荐指数: ...

最新文章

  1. android封装多肽,深度探索C++对象模型之(四)...-Android.animation cts fail-Rails helper_169IT.COM...
  2. Leetcode-最长回文子串(5)
  3. 趣学python3(41)--利用交集计算词类标签的分类
  4. UWP Composition API - GroupListView(一)
  5. PlateSpin 完全复制由于LVM没有可用空闲空间导致失败
  6. C#中Invoke的用法(转)
  7. externalreferences 命令在 sdi 模式下不可用_一个适合新手交互式Git命令学习项目
  8. 一次恐怖的 Java 内存泄漏排查实战
  9. 使用Log4j为项目配置日志输出应用详细总结及示例演示.
  10. 女性最常说的5大谎言:
  11. 此计算机到未能识别网络连接,本地连接显示“未识别的网络”
  12. 关于三甲医院转行IT 医生家属说两句
  13. 动手学深度学习Pytorch Task03
  14. STM32电机控制--API函数应用
  15. matlab中indo是什么意思,Matlab软件电力系统仿真应用简介
  16. 51单片机——LED流水灯
  17. 征途服务器维护镖车怎么办,征途网络游戏家族运镖问题
  18. 2.详解DEBUG模式
  19. 教你如何快速突破TikTok限流--TK领航社tiktok苹果版安卓版下载教程
  20. OpenCV drawMatches出现报错Error: Assertion failed

热门文章

  1. win10远程桌面连接的计算机填什么,win10远程桌面连接设置
  2. AIOps如何解放陷于规则泥潭的用户(一)
  3. mysql 编码格式_设置MySQL的字符编码
  4. 翻转课堂教学动态网站设计论文
  5. docker与traefik2集成
  6. 知道表格文字识别哪个好吗?三招教你轻松表格文字识别
  7. 【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
  8. 多分类标签(one-hot向量)
  9. 群体智能优化算法之鲸鱼优化算法
  10. IT博客助跑未来职场 大学生IT博客大赛热情开幕