iOS-穿针引线 仿喵播直播写后总结

Git:  https://github.com/DrunkenMouse/miaobo

参考:http://www.jianshu.com/p/b8db6c142aad


总结: 

弹幕使用Barrage、编码推流使用LFLive(自带美颜、摄像头切换)、拉流解码使用IJK、特效使用粒子动画 。以下内容建议伴随源码观看。


宏定义:

先判断判断OC语言才执行定义的操作,#ifndef PresfixHeader_pch // 防止头文件被重复引用

#define PrefixHeader_pch //引用头文件  NSLog的输出为DeBug时才输出


showTime(直播)文件夹:

实现直播的文件夹,推流使用的LFLive框架,其自身集合了美颜、摄像头切换、转码推流到服务器

与直播状态的获取等方法

本案例通过自己本地搭建的nginx + RTMP服务器与ffmpeg协议来接收推流,通过IJK框架

实现拉流解码的操作

仿写时发现作者用的LFLive有修改一些文件,而我怎么尝试都失败就只好老老实实pod,而区别仅仅在于直播时的session少了一个推流类型设置为rtmp(本地搭建的服务器,用来接收推流的内容)


网络状态监听:Reachability

据我所知,很多框架都是使用Reachability来监听网络状态,如网络状态是否改变、有网没网、2G、3G、4G还是WIFI


Main - 主界面

主体控件使用tabbarController搭建,包含三个控制器。分为左侧观看直播,中间开启直播,右侧个人中心

开启直播时需判断摄像头可否使用,麦克风可否使用,当前机型是否支持(模拟器不支持直播)

手机型号通过UIDevice的utsname获得,因为系统提供的型号描述与通常我们自己的描述不太相同,所以通过延展类转换


判断是否有摄像头通过UIImagePickerController

判断摄像头权限通过AVAuthorizationStatus

判断是否有麦克风权限通过AVAudioSession


Home(文件夹)-Hot(子文件夹) 热播

使用TbleView来展示页面,顶端广告轮播图的展示使用XRCarouselView第三方,下拉刷新上拉加载使用的MJ

其中下拉刷新是自定义继承了MJ的RefreshGifHeader,通过继承后重写init完成初始化时带有自定义操作,在通过MJ的Block设置时Block内部会调用[[self alloc]init]实现通过类方法生成一个对象

对于下拉加载、上拉刷新时通过网络请求获取所需数据的参数设置使用CurrentPage,CurrentPage值初始化为1。

下拉刷新时CurrentPage值为1,并清空之前通过数组保存的直播数据,而后获取顶部广告与直播数据

上拉加载时CurrentPage值加1,并获取直播数组数据,停止上拉、下拉的刷新状态,新数据添加到当前数组,随后页数减1恢复到原来值

展示时tableViewCell的第一行为广告,其余为直播展示。

广告图片的点击是跳转到一个WebView,通过请求回来的广告信息中的URL跳转

直播视图的点击事件通过tableView的点击事件来响应跳转到另一个控制器展示直播(ADLiveCollectionViewController)

展示直播的控制器是CollectionViewController类型,以便滑动时切换不同主播


Home-Home 热播、最新、关注所在的View

顶部是UIView挂载三个按钮,通过按钮的点击事件来切换underLine的位置,详情可参考我的上一篇文章:按钮点击切换不同页面

滑动选中的按钮与按钮代表的Type值通过枚举值setSelectedType来保存

底部是ScrollView,其宽度是屏幕宽*3,通过将最新最热关心三个控制器加到自身,与将控制器的View加到ScrollView上达到显示的目的

若滚动切换界面,则滚动结束后需设置导航栏的underLine,若ScrollView滑动的当前页过一半即为下一页

皇冠的点击是跳转到一个WebView, WebView通过一个UIViewController展示,通过自定义初始化方法设置WebView的内容,并通过点语法调用创建WebView


Home-NEW 最新

没啥好说的,就是一个TableView

第一行cell为轮播图,其余为直播的介绍,数据通过网络请求获取,点击Cell后跳转到直播页面


Home-Live  所有的直播展示都是通过其来展示

页面由CollectionView展示,展示时只有一个item即为直播的界面内容

init初始化时即设置flowLayout,设置下拉刷新时操作为结束当前刷新。而后currentIndex(区分当前是哪一个页面)+1,若此时currentIndex等于lives.count代表是最后一个主播,则currentIndex变为0,刷新当前collectionView实现直播切换功能

直播页面的详细设置在ADLiveViewCell中,通过currentIndex来区分当前是哪一个页面,lives数组获取直播数据皆由外界赋值

直播关闭事件通过block来调用

直播的显示页面通过自定义cell(ADLiveViewCell)来展示、


对于直播显示页面cell的设置

先设置底部工具栏,通过ADBottomToolView来初始化设置。控件的宽度固定,间距为自动计算,通过ImageView展示内容并开启用户交互,通过自定义添加的手势来响应图片的点击事件,imageView以tag值区分

点击事件中通过block来调用当前控制器中设置的响应事件,目前只有close和publicTalk(弹幕)有响应事件执行,其余为空。

通过insert: aboveSubView: 将其置于placeHolderView之上

placeHolderView如果没有GIF展示,就展示一组默认image,通过自定义ViewController延展类中对象方法howGifLoding: inView: 完成。

具体操作为若传来的image数组为空,则设置一组默认数组,若传来的View为空,则为当前控制器的View。

而后通过ImageView的延展类中对象方法playGifAnim播放,具体播放为通过ImageView的animationImages设置imageArr,通过ImageView的animationDuration设置播放一次的时间,通过ImageView的animationRepeatCount设置播放次数,0为无限,而后通过startAnimating 和 stopAnimating开始\暂停播放

直播时的弹幕效果使用的是BarrageRenderer框架,通过direction设置最大数量

在初始化中通过NSSafeObject与NSTimer结合使得每过0.5秒就当前对象限制一下弹幕数量<=50。NSSafeObject就是通过初始化绑定一个对象与一个方法执行操作

通过对cell的live(主播的相关信息数据)设置,而调用anchorView并设置live,通过anchorView(顶部主播相关视图)的点语法来生成一个UIView视图,每个anchorView都保存有主播user(chaoyangUser)、直播live的相关视图与点击开关。

圆角信息通过maskToBounds来设置,边框使用layer

在线人数与猫粮娃娃皆是随机生成,并通过NSTimer设置为1.0秒更新一次,头像的点击事件与右侧关联头像图标为同一事件。

anchorView生成之后通过block响应关闭的点击事件来控制直播播放器,shouldShowHudView(右侧详细信息)是否开启,默认是关闭的,通过insert插入到placeHolder上

当设置了Cell的live信息后,就开始播放。通过plarFLV: placeHolderUrl:方法

前者为播放的flv,后者为播放时的placeHolderView.image的地址。每次播放时,都将上一次的播放shutdown并移除,粒子特效移除并置空,同类型直播视图移除,并从控制中心移除对自己的监听

而后从新设置IJK的options与Player(options设置音量、帧速率、声音视频的播放模式等,player则为controllor负责flv的播放与播放模式、HudView等),并prepareToPlayer,设置播放器的监听


工会其他主播/类似主播(otherView)显示,开启粒子特效(EmitterLayer)

其中otherView与EmitterLayer都是点语法生成,otherView添加点击手势来响应点击事件

粒子特效使用CAEmitterLayer框架,通过image显示内容,添加到moviePlayer的layer层上

关联主播即为位于当前列表主播的下一个主播,若当前主播为最后一个主播,则下一个主播即为第一个主播,通过外界赋值获取数据,重写set方法显示catEarView

如果相关主播值为nil,就隐藏catEarView,catEarView(ADCatEarView)通过options设置只播放视频没有声音且自动播放,而后通过播放控制器播放,圆角为自身View的mask.

需注意,要重写removeFromSuperView,判断播放器存在时应先关闭remove而后置空


对于关联主播的点击事件

通过block调用写在控制器里的事件,当播放器的播放状态发生改变时

如果是自动播放,并当前控制器没有播放时则开启播放(如网络状态不好暂停后恢复),并于一秒后移除placeHolderView,添加弹幕,隐藏父控制器的GIF

如果正在播放状态则隐藏父控制器的GIF,如果是网络不佳正在加载状态就让父控制器显示GIF,所以若网络状态不好, 断开后恢复, 也需要去掉加载

播放结束时需判断若因为网速或者其他原因导致直播stop了而且GIF没有显示,则也要显示GIF,存在状态如暂停状态后直接stop,所以自动暂停时不需要判断,而后从新获取直播flv数据开始播放,若获取失败则关闭移除播放器并置空

Home - web

点击皇冠后的页面用Web展示,webView通过点语法设置,在initWithUrl的时候就创建出了webView并设置了内容。


至此,穿针引线思路完毕。

你可能感兴趣的:(iOS-穿针引线 仿喵播直播写后总结)