iOS直播功能总结

作者: 翻炒吧蛋滚饭 | 来源:发表于2016-12-28 07:44 被阅读3486次

前言

最近为我们的名厨APP加入了直播功能,总体来说,难度不能算特别高,但对细节的打磨,才是直播的难点所在,因为,一个直播间,播放、聊天、点赞、弹幕等等等,全部放在一个页面去处理,你就不得不考虑这其中的性能问题以及功能过多导致的潜藏bug了,我这里就我所做的直播功能进行一些总结,有需要开发直播模块的开发者,可以稍微参考下,我也会粘一些git上比较好的库过来,减少大家的开发成本

播放器和推流

首先说一下,直播中最最重要的元素,那就是视频播放器了。视频播放器的选择,其实是非常多的,最著名的,非b站的IJKPlayer莫属了。其实现在很多三方的播放器,开发者在编写的时候,都是按照系统的MPMoviePlayer的接口设计的,所以,你只要学会使用一个播放器,其他播放器的使用都会很轻松的上手。
  附上两个比较有参考价值的demo,一个是自定义IJKPlayer,进度条、音量、亮度,可以参考这个demo,对IJKPlayer进行深度的个性化定制(其他播放器也适用),比如大部分播放器支持的屏幕手势(滑动调整音量、亮度、进度等),另一个是ZFPlayer,这个播放器基于AVPlayer,主要可以参考里面的横竖平切换的处理,也可以直接拿来做普通的视频播放器继承在应用中,很多功能都已经做好,用起来很方便。
  关于直播的推流,目前来说最火的应该是这个了LFLiveKit。具体我没有使用过,但有一些个人仿写项目都是IJKPlayer配合LFLiveKit完成的。
  下面推荐几个个人仿写的项目,可以参考下大部分直播中会出现的场景的处理策略。这个是仿映客的520Linkee,这个是仿喵播的MiaowShow,这两个都是市面上比较常见的个人手机端直播的典型实现方案。
  至于我所使用的播放器和推流SDK,因为我们的直播服务是和金山云合作的,所以两个SDK都是用的金山云自家的SDK,他们的SDK更新频率挺快的,而且最新版已经支持https了。但他们的SDK也存在一些bug,不过好在他们的每一版更新都会及时的进行修复。
  经过对比了好多家的SDK demo(阿里、网易、腾讯、七牛等)后,你会发现金山的SDK demo是写的最完善的,推流端你直接拿过来给个推流地址就可以推了,包括美颜、码率、编码等等,都在demo上有选项可供设置,你只要在开发的时候,对这些功能重新设计下UI就好了。播放器demo推流demo,建议在使用的过程中,多跟进他们的更新release,你会发现他们每次更新都会优化很多功能、修复很多bug(不像友盟,每次更新都有新bug!!!气人!!!)。

聊天

既然大家都在看直播,互动肯定也少不了,直播聊天室就必须要有。我们用的是融云,因为融云的宣传和口碑都不错,所以就选择了融云,而且也是好多直播服务商的合作伙伴,所以可以放心使用。其他的还有环信和野狗,环信的控制台和文档,不如融云友好,野狗的没有试过,个人建议使用融云。而且融云官网有集成了播放器、聊天的直播间demo可以参考,里面带了一个香港某电视台的直播流,可以用来测试用来 rtmp://live.hkstv.hk.lxdns.com/live/hks
  然后聊天中的聊天列表的处理,可以参考我的这篇简书来处理,以优化性能 http://www.jianshu.com/p/518e9c169274
  这里有一点需要注意,在一个controller中,将当前controller设置为融云的消息接收代理,就可以接收融云消息了。

[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:self object:nil];

在页面dealloc中不要只调用 [RCIMClient sharedRCIMClient] quitChatRoom 退出直播间就觉得没事了,因为退出直播间是异步的,可能在当前controller dealloc后才会退出,如果在这段时间收到新的消息,[RCIMClient sharedRCIMClient]就会因为delegate释放了而导致崩溃,所以要在当前controller的dealloc中设置消息接收代理为nil。

[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:nil object:nil];

点赞动画

点赞动画可以参考这个 https://github.com/singer1026/DMHeartFlyAnimation ,主要通过CAKeyFrameAnimation和UIBezierPath完成,也可以自行修改代码修改动画轨迹、替换点赞图片等。

弹幕

弹幕建议使用BarrageRenderer,性能不错,git主页的介绍,就能让你很简单的上手使用,但如果你要做历史消息的弹幕和即时消息结合的弹幕,建议历史弹幕的遍历以及时间轴绑定,还是自己写比较好,因为这个库的redisplay以及绑定时间轴方法,在与即时消息结合的时候,弹幕的展示可能会有重复出现多次的现象。

网络切换

直播中我们要考虑用户的当前网络状态,移动网络帮他停止播放,或者切换到wifi的时候,帮他重连,以减少流量的耗费。网络的变化主要通过两种方式判断,一种是Reachability,另一种是获取状态栏上的网络状态。
  Reachability写在AppDelegate中,在网络状态变化的时候,block中的代码就会被调用,你想把网络变化的消息发送给直播页面,直接用通知中心就可以,然后Reachability建议使用AFNetworking的,因为之前有文章说Reachability库可能会引起不支持ipv6导致审核被拒,我们项目中用的AFNetworking中的Reachability,没有问题:

- (void)monitorNetworking {
    AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
    
    [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
                wifi网络
                break;
                移动网络
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                无网络
                break;
                
            case AFNetworkReachabilityStatusUnknown:
                未知网络
                break;
                
            default:
                break;
        }
    }];
    
    //开始监控
    [mgr startMonitoring];
}

获取状态栏网络状态,有人说在状态栏隐藏的页面,没法获取网络状态,实测是可以获取的,方法里面有我写的枚举,替换下就好了:

- (NSString *)getCurrentNetWork {
    NSArray *subviews = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    for (id child in subviews) {
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            //获取到状态栏码
            int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
            switch (networkType) {
                case 0: {
                    //                    states = NetworkStatesNone;
                    return CurrentNetWorkNone;
                }
                    break;
                    
                case 1: {
                    //                    states = NetworkStates2G;
                    return CurrentNetWorkMobile;
                }

                    break;
                    
                case 2: {
                    //                    states = NetworkStates3G;
                    return CurrentNetWorkMobile;
                }
                    break;
                    
                case 3: {
                    //                    states = NetworkStates4G;
                    return CurrentNetWorkMobile;
                }
                    break;
                    
                case 5: {
                    //                    states = NetworkStatesWIFI;
                    return CurrentNetWorkWifi;
                }
                    break;
                    
                default: {
                    return CurrentNetWorkNone;
                }
                    break;
            }
        }
    }
    
    return CurrentNetWorkNone;
}

结语

如果还想了解其他我没有列举出来的功能的话,可以给我留言,我会尽我能力所及的补充完善这篇文章。

相关文章

  • 2018-11-14

    iOS直播功能总结 - 简书

  • iOS直播功能总结

    前言 最近为我们的名厨APP加入了直播功能,总体来说,难度不能算特别高,但对细节的打磨,才是直播的难点所在,因为,...

  • iOS直播功能总结

    播放器和推流 首先说一下,直播中最最重要的元素,那就是视频播放器了。视频播放器的选择,其实是非常多的,最著名的,非...

  • ios 直播变声功能

    最近有做iOS直播变声的需求,于是去网上搜索了可用的第三方变声库,最终选定了SoundTouch,SoundTou...

  • [iOS功能]-总结

    1、禁止手机睡眠 2、隐藏某行cell 3、禁用button高亮 4、tableview遇到这种报错failed ...

  • uni插件-iOS流程自整理

    uni插件-iOS流程自整理 目标需求:集成带有阿里直播功能的uni插件(iOS) 1 准备内容 1.1 uni集...

  • What's New in iOS 11

    iOS 11.0 本文总结了iOS 11中推出的主要开发者相关功能,该功能在当前运行的iOS设备上运行。该文章还列...

  • 2019-03-24

    本周工作总结 1、BIM直播支持——直播平台更新了,提前花了时间和总部老师对接,了解了直播平台功能和操作 直播宣传...

  • 抓取直播app数据

    做直播app功能的话,需要直播地址测试,这里总结获取直播源方法。 1、下载工具 Wireshark 2、通过互联网...

  • 每日一页,大家随我学策划——怎样策划建设中卫市八宝茶早茶文化广场

    第二十日: 1.2、直播回放 视频直播同时将视频文件保存起来,用来进行直播回放,相关功能总结如下:...

网友评论

  • 吉s她Hmm:大神 我最近也在做直播 你觉得那个第三方SDK比较 求指教。加我的扣扣 870814708 问题答案魏文涛。谢谢,我们探讨一下。。。。
  • 旧时凉梦已成风:请教大神,你做过两个直播流切换吗?
  • 输入个昵称太难了:你好,我问一下,我们现在有pc段开播和手机端开播,这两段的开播的界面,基本上是一样的,就是播放器的大小不一样,你们这个是如何处理的呢??
    输入个昵称太难了:@旧时凉梦已成风 这个还真没有
    旧时凉梦已成风:大神,做过两个直播流切换吗
    翻炒吧蛋滚饭:@输入个昵称太难了 pc我没做过,应该是有专门的工具的吧
  • 下雨就好:非常好!!!!
  • sharlley:使用金山的推流SDK, 推流地址有限制吗?
    翻炒吧蛋滚饭:@sharlley 应该是没有限制的
  • block_smile:你好,写的不错,我想请教一个问题,如何获取用户观看直播的时长呢?比如付费直播,我想让用户体验观看五分钟,看过五分钟就要去付费,应该怎么搞呢?谢谢啦!
    翻炒吧蛋滚饭:@block_smile 不用谢,提供个简单思路,可以考虑再优化优化
    block_smile:@翻炒吧蛋滚饭 谢谢啦
    翻炒吧蛋滚饭:@block_smile 这种应该是限制用户只能看开头的五分钟吧,可以取消快进功能,然后用定时器判断,如果视频播放日常超过5分钟,就停止播放,提示购买,大致这样吧
  • 豆宝的老公:你好,直播拉流推流的原理哪里有讲解的,我说的是音视频编码之后推流出去这个过程,有代码吗
    翻炒吧蛋滚饭:@高乔人 大神不敢当,有问题可以一起讨论
    高乔人:666,博主总结的太好了,刚好公司现在要做这个,以后又不懂的请大神指导一下哈
    翻炒吧蛋滚饭:@allentsing 这个不知道,可以看看那些rtmp协议原理什么的
  • 伦敦乡下的小作家:写的太好了,过几天视频播放项目就指望楼主的博客了,有不懂地方希望多指教。
    翻炒吧蛋滚饭:@伦敦乡下的小作家 加油
  • End_af9c:赞 非常感谢 正在烦恼中~~~
    翻炒吧蛋滚饭:@End_af9c 加油
  • 夏天爱大树:请问下用的三方的SDK都是收费的吗?比如金山的
    翻炒吧蛋滚饭:@夏天爱大树 总体来说比较快吧,一个月差不多,到我们后期改版加需求变来变去的又耽误一个月,总体难度不高的
    夏天爱大树:@翻炒吧蛋滚饭 感谢,最近研究这块,还想问个问题,用三方的你们当时开发第一版用了多久!
    翻炒吧蛋滚饭:@夏天爱大树 直播流量是收费的
  • f819d773bb62:赤赤好厉害!以后做直播就找你了
    翻炒吧蛋滚饭:@不懂的青春 :smile:
    f819d773bb62:@翻炒吧蛋滚饭 :disappointed_relieved::disappointed_relieved::disappointed_relieved:
    翻炒吧蛋滚饭:@不懂的青春 感谢这位不知名的粉丝:kissing_closed_eyes:

本文标题:iOS直播功能总结

本文链接:https://www.haomeiwen.com/subject/fnfmyttx.html