直播项目详解

项目下载地址

项目文件结构:

  • Login : 登录页面集成了友盟第三方登录微信和QQ,新浪授权登录是请求新浪官方的OAuth请求,以及一些登录所需要的资源
  • Main :主要包含标签视图控制器UITabBarController 、导航控制器UINavigationController、数据请求工具类XLLiveTool、业务逻辑类XLDealData、代理类、pch文件和单例的头文件,都是一些全局都能用的东西。
  • Home : 首页,主要包括热门,最新和关注三部分,把这三部分添加到(XLHomeViewController)里面去,方便以后做处理,自定义navigationItem.titleView因为要靠路适配问题这里我把宽设置为屏幕宽度的一半;我有自定义了UISrollView,这纯属个人爱好你也可以直接在home控制器里面添加
  • Live : 直播,分两部分看直播和自己直播,看直播主要用了IJKMediaFramework.framework这个框架,直播用到了LFLIveKit另外他还封装了GPUImage可以直接实现智能美颜效果,重点在直播页面的布局和数据处理,要考虑不同机型的屏幕适配和数据传输中不出现问题,具体操作请看代码
  • Other : 这个文件夹主要放的是分类,拓展类,plist和第三方库
  • CrownRank :这个类主要作用是请求加载webView,排行榜、热门视图的头标题跳转都是利用这个类实现的
  • Search : 搜索页面,这个页面我没有做,有兴趣的可以自己添加,基本页面已搭好
  • Profile : 个人中心页面主要完成下拉图片放大和波纹效果,跳转页面没有做框架已经打好,有兴趣可以自己填

项目详解:

1.登录模块,运行时不难发现登录页面的背景视频是随机播放的,第三方登录按钮是自定义一个view里面添加UIButton,由于要考虑到自动布局,所以我是这样写的,重写了布局方法,别忘了在前面创建按钮的时候给按钮设置tag,方便监听点击了那个按钮.

- (void)layoutSubviews {

 [super layoutSubviews];

 NSInteger count = self.subviews.count; 

 for (int i=0; i<count; i++){ UIButton *btn = self.subviews[i];

 CGFloat margin = (XLScreenW - btn.width* count) / (count + 1); CGFloat x = (btn.width + margin) * i + margin;

 CGFloat y = 0; btn.frame = CGRectMake(x, y, btn.width, btn.height); 

 }

 }

  

2.一个父控制器HomeViewController+三个子控制器(热门/最新/关注. 每个控制器各自管理自己的业务逻辑, 高内聚低耦合). 重写HomeViewController的loadView, 自定义UIScrollView, 将三个子控制器的view添加到UIScrollView上.将self.view替换成UIScrollView

3 . 直播,主要实现功能头部主播信息,旋转主播组信息,猫耳视图是随机送这一组里选择一个主播只有画面没有声音,底部功能按钮实现分享等功能(详情请看代码),另外还有

粒子效果类似于点赞

CAEmitterLayer *emitterLayer = [CAEmitterLayer layer]; // 发射器在xy平面的中心位置 emitterLayer.emitterPosition = CGPointMake(self.moviePlayer.view.frame.size.width-50,self.moviePlayer.view.frame.size.height-50); // 发射器的尺寸大小 emitterLayer.emitterSize = CGSizeMake(20, 20); // 渲染模式 emitterLayer.renderMode = kCAEmitterLayerUnordered; // 开启三维效果 // _emitterLayer.preservesDepth = YES; NSMutableArray *array = [NSMutableArray array]; // 创建粒子 for (int i = 0; i<10; i++) { // 发射单元 CAEmitterCell *stepCell = [CAEmitterCell emitterCell]; // 粒子的创建速率,默认为1/s stepCell.birthRate = 1; // 粒子存活时间 stepCell.lifetime = arc4random_uniform(4) + 1; // 粒子的生存时间容差 stepCell.lifetimeRange = 1.5; // 颜色 // fire.color=[[UIColor colorWithRed:0.8 green:0.4 blue:0.2 alpha:0.1]CGColor]; UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"good%d_30x30", i]]; // 粒子显示的内容 stepCell.contents = (id)[image CGImage]; // 粒子的名字 // [fire setName:@"step%d", i]; // 粒子的运动速度 stepCell.velocity = arc4random_uniform(100) + 100; // 粒子速度的容差 stepCell.velocityRange = 80; // 粒子在xy平面的发射角度 stepCell.emissionLongitude = M_PI+M_PI_2;; // 粒子发射角度的容差 stepCell.emissionRange = M_PI_2/6; // 缩放比例 stepCell.scale = 0.3; [array addObject:stepCell]; } emitterLayer.emitterCells = array; [self.moviePlayer.view.layer insertSublayer:emitterLayer below:self.catEarView.layer]

弹幕效果(开启后会有卡顿现象)

弹幕使用的也是一个第三方轮子BarrageRenderer . 这个开源项目的文档都是中文的, 用法也是很简单的.

- (instancetype)init { if (self == [super init]){ self.bottomToolView.hidden = NO; _renderer = [[BarrageRenderer alloc] init]; _renderer.canvasMargin = UIEdgeInsetsMake(XLScreenH * 0.3, 10, 10, 10); [self.view addSubview:_renderer.view]; NSSafeObject * safeObj = [[NSSafeObject alloc]initWithObject:self withSelector:@selector(autoSendBarrage)]; self.timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:safeObj selector:@selector(excute) userInfo:nil repeats:YES]; } return self; } #pragma mark - 弹幕描述符生产方法 long _index = 0; /// 生成精灵描述 - 过场文字弹幕 - (BarrageDescriptor *)walkTextSpriteDescriptorWithDirection:(NSInteger)direction { BarrageDescriptor * descriptor = [[BarrageDescriptor alloc]init]; descriptor.spriteName = NSStringFromClass([BarrageWalkTextSprite class]); descriptor.params[@"text"] = self.danMuText[arc4random_uniform((uint32_t)self.danMuText.count)]; descriptor.params[@"textColor"] = XLColor(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256)); descriptor.params[@"speed"] = @(100 * (double)random()/RAND_MAX+50); descriptor.params[@"direction"] = @(direction); descriptor.params[@"clickAction"] = ^{ [MBProgressHUD showAlertMessage:@"弹幕被点击"]; }; return descriptor; } //最后别忘了开始 [_renderer start];

4.H264硬编码  如果使用ijkplayer 使用硬解码, 一句代码即可.

[option setPlayerOptionValue:@"1" forKey:@"videotoolbox"];

硬编码的应用场景: 我们要将主播的视频数据传送给服务器

通过摄像头来采集图像,然后将采集到的图像,通过硬编码的方式进行编码,最后编码后的数据将其组合成H264的码流通过网络传播。

摄像头采集图像, iOS系统提供了AVCaptureSession来采集摄像头的图像数据. 项目中我是直接使用 GPUImage 中的GPUImageVideoCamera, 直接设置GPUImageVideoCamera的代理即可, 在其代理方法- (void)willOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer;进行数据编码即可.

切记一点: 不管是系统自带的AVCaptureSession还是GPUImageVideoCamera采集到的数据都是未经过编码的CMSampleBuffer.

5.下拉图片放大和波纹效果大家想要实现波纹就要对正玄波有所了解,废话不多说直接上DEMO:

下载地址:https://github.com/XLAccount/XLTableView

OK接下来看看别的---==============

接下来看看项目中遇到的错误是怎么解决的吧

1.常见的令人抓狂的linker错误

2. was mutated while being enumerated

待续。。。。

时间: 2024-10-22 04:34:09

直播项目详解的相关文章

eclipse里面构建maven项目详解(转载)

本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven主要服务于基于java平台的项目构建.依赖管理和项目信息管理,无论是小型的开源类库项目,还是大型的企业级应用,maven都能大显身手. 置于maven的安装过程及在eclipse里面配置maven,请看我在

tomcat通过conf-Catalina-localhost目录发布项目详解 摘自:http://www.cnblogs.com/iyangyuan/archive/2013/09/12/3316444.html

Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目,是最佳选择. 因为这样对tomcat的入侵性最小,只需要新增一个配置文件,不需要修改原有配置:而且支持动态解析,修改完代码直接生效(修改配置除外). 但是网上关于这种方法的介绍很简单,小菜来补充一下. 1.直接在eclipse中添加一个server,添加过程中指明tomcat的路径即可. 2.在tomcat服务器的conf\Catalina\local

tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解

tomcat通过conf-Catalina-localhost目录发布项目详解 Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目,是最佳选择. 因为这样对tomcat的入侵性最小,只需要新增一个配置文件,不需要修改原有配置:而且支持动态解析,修改完代码直接生效(修改配置除外). 但是网上关于这种方法的介绍很简单,小菜来补充一下. 1.直接在eclipse中添加一个server,添加过程中指明tomca

「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

?关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: (一)采集 (二)处理 (三)编码和封装 (四)推流和传输 (五)延迟优化 (六)现代播放器原理 (七)SDK 性能测试模型 本篇是<视频直播技术详解>系列的最后一篇直播云 SDK 性能测试模型,SDK 的性能对最终 App 的影响非常大.SDK 版本迭代快速,每次发布前都要进行系统的测试,测试要

[转帖](整理)GNU Hurd项目详解

(整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU操作系统的真正内核,然而它从未真正降临人间.Linus Torvalds曾经写过,如果GNU kernel在1991年春天发布,他不会启动Linux项目.GNU操作系统项目始于1984年,在Linux出现之前它有7到8年的时间创造出一个可用的内核,然而它的开发进程,不时被频繁的改变中断.Richar

Usage、Usage Minimum和Usage Maximum项目详解

(1)一个产生多个数据域(Report Count>1)的主项目之前有一个以上的[用途]时,每个[用途]与一个数据域依次对应,如果数据域个数(Report Count)超过[用途]的个数,则剩余的数据域都对应于最后一个[用途]. (2)Usage.Usage Minimum和Usage Maximum项目关系 这3个项目输入Local类型项目. Usage项目和Global类型的Usage Page项目协同描述项目或集合的功能. 一个报表可以指定一个Usage给许多个Report Count(数

PHP写在线视频直播技术详解

2016年7月22日 22:26:45 交流QQ:903464207 目前楼主专注php开发,最直接的方法就是使用lnmp去直接做,搜索以下资料,发现还是行得通的,先把基础架构列出来 前端页面 php 弹幕flash+js 数据来源是redis集群 及时聊天 redis集群 +js长连接 礼物系统 服务器流媒体 nginx-rtmp-module 在线调用ffmpeg对流媒体进行转码 基于HTTP的FLV/MP4 VOD点播HLS (HTTP Live Streaming) M3U8的支持基于h

Mac下Intellij IDea发布Web项目详解一

Step1 新建JavaEE Project并进行相应设置 1.1 如图 1.2 填下项目名,我写WebWorkSpace.这里相当于Eclipse中的workspace,写完点[Finish] 1.3 如图,按照1==>2==>==>4的步骤一路向下  1.4 新建项目后,Intellij Idea中是酱了滴~ 1.5 鼠标单击WebWorkSpace1项目名,然后右键,选[Open Module Settings]  1.6 进到这个页面后,按照这里写的一路向下走 1.7 点path

切换台进行多机位切换画面现场直播搭建详解教程

超多机位的导播作业是不少活动项目需要的方式,尤其是运动会.大型演唱会.校园远程教育及晚会活动的异地连线直播.要运用超多机位现场导播作业,在导播系统上就必须达到10组以上输入,才能够适时的把节目内容呈现观众眼前,这样直播画面才具有多花样的变化. 那么如何才能搭建出多机位画面切换输出的现场直播呢?搜索引擎搜索了一下发现对于切换台多机位的直播问题,很多网友都有疑问. 洋铭切换台与索尼摄像机怎么连接? 现场多机位视频直播都需要什么设备? 如何使用洋铭切换台blackmagic采集卡实现网络直播教程? 切