最近由于需求的变动,项目内把最初最简单的原生直播框架变成了B站开源的ijkplayer框架,下面把具体的过程总结一下整个过程都比较简单,重要的是理解的过程,集成完毕之后,视频的用户体验比苹果原生好了很多。最后会贴出demo的git地址,只需要简单的操作就能快速的在项目中加入该框架

先把B站开源ijkplayer的github地址贴出来 https://github.com/Bilibili/ijkplayer
未使用过的同学,请去自取有助于理解整个视频框架的原理。

** 为何要改变原来项目内的视频直播,录播框架?**

首先我先说一下为何我们项目内会修改原来原生的直播与视频框架,这个过程能体现出来ijkplayer对比iOS原生的各种优点。

1.我们最初使用的原声直播是使用MPMoviePlayerController,该类苹果官方有提示让使用AVPlayerViewController来替代,虽然MPMoviePlayerController就目前来看还可以正常使用,但是可能在未来不久的时间就会出现问题。
2.对比直播:直播的第一指标是延迟问题,苹果原生的直播协议仅支持hls协议,而ijkplayer不仅支持hls,也支持rtmp协议,hsl协议的弊端就是让人头疼的延迟问题,该协议会把视频切成一段一段的m3u8的视频片段,延迟一般来说会到10秒左右,而rtmp协议延迟非常小,从修改完之后的情况来说,视频的流畅度提高了非常多。这条原因,是修改直播框架的根本原因之一。
3.对比录播流:如果同时播放云端存储的视频流,它存在着一些不可回避的问题,那就是支持的视频编码格式很有限:H.264、MPEG-4,扩展名(压缩格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等。这种支持对于运营的操作要求很高,支持的格式比较少。而ijkplayer不仅包括了原生可以支持的所有格式,主流的视频格式基本可以全部支持。
4.对比用户交互:MPMoviePlayerController自定义样式和用户交互的一些手势操作非常有限,而ijkplayer你几乎可以定制一切你可以想到的交互,主流的直播app都在使用。

对比以上几条原因,我们在项目中进行了进一步的升级,使用ijkplayer的需求非常迫切。

** 主要代码相关**

具体demo会在下方贴出链接,这里仅演示最重要的几步要求。

1.下载完毕demo后,由于ijk的framework包比较大所以没有跟着项目一起上传,需要先将github地址详情内的ijk的framework的zip包下载下来,导入项目,并且将路径配置好。

其实打出来ijk的framework包的这个过程是一个非常好的理解过程,由于有很多打包流程,这里贴出来一个比较详细的供大家参考
点这里,这个过程比较详细

2.导入下图中的几个文件

 
Paste_Image.png

3.项目内初始化关键代码,写入即可运行

    // 创建盛放视频播放器的父视图 用于改变全屏和缩小
_headPlayerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*videoTempProgress)];
[self.view addSubview:_headPlayerView]; //测试地址
//rtmp 直播 香港电视台测试地址 rtmp://live.hkstv.hk.lxdns.com/live/hks
//录播 播放流http://hc.yinyuetai.com/uploads/videos/common/E49E014999C93F5A88EA01B2B48161CE.flv?sc=fc5276d37b6cd89c&br=775&vid=2178416&aid=2650&area=Other&vst=3 //该模型可以随意设置 来传入你想自定义的内容
XYVideoModel *model = [[XYVideoModel alloc]init];
model.url = [NSURL URLWithString:@"http://hc.yinyuetai.com/uploads/videos/common/E49E014999C93F5A88EA01B2B48161CE.flv?sc=fc5276d37b6cd89c&br=775&vid=2178416&aid=2650&area=Other&vst=3"];
model.name = @"测试标题测试标题测试标题";
model.coverimg = @"coverimg.jpeg"; // 创建视频播放控件
self.playerView = [[LMVideoPlayerView alloc]initWithModel:model];
//遵循LMVideoPlayerViewDelegate 来实现退出全屏 和 放大的代理
self.playerView.delegate = self;
[_headPlayerView addSubview:self.playerView];
#pragma mark XYVideoPlayerViewDelegate
//全屏按钮代理方法
- (void)fullScreenWithPlayerView:(LMVideoPlayerView *)videoPlayerView
{
//点击放大旋转和返回缩小的方法
if (self.playerView.isRotate) {
[UIView animateWithDuration:0.3 animations:^{
_headPlayerView.transform = CGAffineTransformRotate(_headPlayerView.transform, M_PI_2);
_headPlayerView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
self.playerView.frame = _headPlayerView.bounds; }]; }else{ [UIView animateWithDuration:0.3 animations:^{
_headPlayerView.transform = CGAffineTransformIdentity;
_headPlayerView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*videoTempProgress);
self.playerView.frame = _headPlayerView.bounds;
}]; }
}
//返回按钮代理方法
- (void)backToBeforeVC{ if (!self.playerView.isRotate) { [self.navigationController popViewControllerAnimated:YES];
}
}

** github demo地址**

demo地址,欢迎star

如果有任何疑问和对ijk的理解问题,可以随时留言或者私信沟通

作者:死涵Leesim
链接:https://www.jianshu.com/p/3c109b2c5ba9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

iOS 快速集成ijkplayer视频直播与录播框架的更多相关文章

  1. iOS中集成ijkplayer视频直播框架

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  2. iOS:集成ijkplayer视频直播

    介绍: ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集 ...

  3. iOS集成ijkplayer视频直播框架,遇到的bug和坑...

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #555555 } p. ...

  4. iOS开发之集成ijkplayer视频直播

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  5. 集成IJKplayer视频直播框架

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  6. iOS----集成ijkplayer视频直播

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  7. iOS快速集成友盟社会化分享功能(v6.1.1)

    1.  U-Share SDK集成 1.1 下载U-Share SDK 通过iOS社会化组件选择所需的社交平台后进行下载,下载链接http://dev.umeng.com/social/ios/sdk ...

  8. IOS快速集成下拉上拉刷新

    http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5% ...

  9. 混合开发之iOS快速集成DSBridge

    DSBridge-IOS github:https://github.com/wendux/DSBridge-IOS 使用 Native 实现API 代理类 //JsApiTest.m @implem ...

随机推荐

  1. 用好lua+unity,让性能飞起来——关于《Unity项目常见Lua解决方案性能比较》的一些补充

    <Unity项目常见Lua解决方案性能比较>,这篇文章对比了现在主流几个lua+unity的方案 http://blog.uwa4d.com/archives/lua_perf.html ...

  2. ugui中toggle.isOn的属性笔记

    准备知识 toggle:指unity3d引擎中UGUI的 toggle组件 (单选框) 本文使用lua语言描述 事件触发 使用unity的ugui,你如果细心观察会发现toggle在界面被关闭/隐藏( ...

  3. Nginx使用教程(二):Nginx配置性能优化之worker配置

    配置Nginx workers <br\>NGINX根据指定的配置运行固定数量的工作进程. 这些工作进程负责处理所有处理. 在下面的章节中,我们将调整NGINX worker参数. 这些参 ...

  4. JavaScript的内置对象(Math对象)

    Math对象概述 Math(算数)对象的作用是:执行常见的算数任务.保存数学公式和信息. 与我们在JavaScript 直接编写计算功能相比,Math 对象提供的计算功能执行起来要快得多. Math ...

  5. HTTP请求报文解剖

    转自:https://www.iteye.com/topic/1124408 HTTP请求报文由3部分组成(请求行+请求头+请求体): 下面是一个实际的请求报文: ①是请求方法,GET和POST是最常 ...

  6. PHP设计模式_工厂模式

    个人理解工厂类相当于平时用的基类,只需要把类new一次然后付给一个变量,以后直接引入基类调用变量使用类里的方法即可 了解 工厂模式,工厂方法或者类生成对象,而不是在代码中直接new. 使用工厂模式,可 ...

  7. Python:Day05 格式化输出、列表

    注释:3个单引号或3个双引号 3个引号(单引或双引)还有另外一个作用:打印多行. msg = """hello 1 hello 2 hello 3"" ...

  8. 好程序员分享Javascript设计模式

    方法一 对象字面量表示法 在对象字面量表示法中,一个对象被描述为一组包含在大括号中,以逗号分隔的 name/value 对.对象内的名称可以是字符串或标识符,后面跟着一个冒号.对象中最后一个 name ...

  9. Python 中的浅拷贝和深拷贝

    1. 列表和字典,直接赋值,都是浅拷贝,即赋值双方指向同一地址,因为 Python 对可变对象按引用传递. >>> a = [1, 2, 3] >>> b = a ...

  10. 操作循环的关键字switch,break,return的应用及区别

    break 使用break结束循环  break可以终止循环 和 switch语句的运行; break用于结束一个循环,即跳出循环体,执行循环体之后的代码: switch 使用continue提前结束 ...