版权声明:本文为“影公子zx”原创文章,经原创者同意后编写!
原文链接:http://blog.csdn.net/qq_34203492/article/details/93767915
前言:
- 最近公司开发app直播功能,我是后端,使用java开发,经过考虑选择使用腾讯的云直播功能,主要是考虑到腾讯在这方面可以说是很有实力的了。然后就是选择产品的问题,腾讯提供了几种直播的解决方案,最完整的是互动直播,这是一套比较完善的直播解决方案,但是费用比较贵,所以。。。我们选择了云直播和云通信(IM)组合,主要是因为本来app中就集成云通信,也就是云直播用来做视频交互,云通信用来做弹幕和直播间内的业务交互。不要问我为啥不自己搭建直播服务,没技术、更没实力,光带宽就能搞死人,好了废话不多说,开始记录。
正文:
- 在考虑自己的需求是不是合适腾讯直播的时候,可以先注册一个腾讯云账号,在腾讯云产品中选择云直播,开通服务并进入云直播产品控制台,新用户免费赠送20G的测试流量,可以让你测试是否适合使用,好不好用。
- 创建拉流(播放视频流)和推流(主播直播视频流)域名,这些在腾讯云直播的文档里面都有,我就不做搬运工了,文档链接:https://cloud.tencent.com/document/product/267/32732
- 2019/09/05补:如果直播需要海外直播的话,其实很简单,腾讯云直播有海外加速节点,如果是主播在海外直播,用户在国内看,那么只需要你推流地址CNAME对应的域名是国内已经备案过的域名,那么默认就可以在国外直播,如果你没有已经备案过的域名,那么在你创建账号的时候,腾讯云会给你自动生成一个推流域名,你可以直接使用那个域名推流,那个默认开着海外节点的,如果是国内开播,国外看播,那不存在啥问题的,因为国外本来就可以自由访问国内网络,文档贴一下:https://cloud.tencent.com/document/product/267/14621
- 创建好两个地址之后,可以先去云直播控制台的辅助工具中找地址生成器,根据你创建的推流拉流地址测试着创建两个地址,熟悉一下这个地址的规则,AppName其实就是区分你这个地址属于你的哪个app,或者根据你的具体需求,可以是不同的app,也可以是不同的业务区分,StreamName就是相当于你的直播间号(直播间id),两个都生成一下之后就会发现推流和拉流地址其实是对应的,具体大家自己试试哈
- 补一个腾讯云文档中的生成鉴权串的代码:
- https://cloud.tencent.com/document/product/267/32833
- 因为我们的业务是手机直播,手机看播,所以推流自然就是手机推流,这里需要前端同学(ios?安卓?)配合,在手机端使用腾讯云直播文档中提供的SDK,把生成的拉流和推流地址进行测试,具体我就不懂了哈,我是个彩笔后端,前提说一下:如果是手机端直播,推流只能是用:rtmp格式;拉流的话我们选择:FLV格式,每种格式的优缺点腾讯云文档中说的很清楚了,大家自己去看哈,我们选择FLV是因为FLV综合来说延迟较低、适用性高。调试推流和拉流的时候,有一个小程序可以用来调试:腾讯云视频
- 这些都准备好之后,就是直播的问题了,这里要看你们的直播需求是怎么样的,我这里举个大众化的例子,就是每个用户都可以有自己的直播间,当你有推流和拉流域名之后,你可以定一个AppName,这个AppName就是一个标识,然后你需要建一张数据库表:LiveRoom(名字随意),这个表的主键就可以用来当作房间号(你也可以使用其他字段),这个房间号,其实就是拼接到推流和拉流地址里面的StreamName,这个StreamName不需要手动去腾讯云注册,直接拼接在地址中使用就好,注意不同直播间的StreamName不能相同哈,如果你的推流地址中的StreamName相同,那么只有第一个开始推流的是有效的,也就是说同样的推流地址,谁先推谁的有效,拉流只能拉到第一个推流的那个。
- 如果以上都成功了,那么恭喜你视频交互是可以使用了,其他的就是完善细节问题了,那么直播肯定要有弹幕啊,所以就需要云直播和云通信配合使用了,云通信具体不是我搞的,我就不在这里多说了,反正类似qq聊天群,一个直播间可以对应一个聊天室群,把聊天室和直播间绑定,主播开播之后,视频推流开始,同时IM接入,主播就是这个聊天室群的群主(或者管理员),可以禁言所有用户,也可以全体禁言,同时直播间中的所有交互,都可以使用IM来做交互,比如直播间水友聊天、用户进入直播间、用户在直播间购买了某些商品等等,都可以通过前后端配合定义各种消息类型(json格式的等等),如果是普通的直播间聊天,那么直接前端给IM服务发消息,不用经过我们自己的app,减少交互带来的服务器压力,客户端收到消息直接显示为弹幕。但是比如某用户进入直播间这种,就可以通过服务端给IM服务发一条消息,这个消息的内容就是和前端定好的消息类型,比如消息是json格式,其中有个type表示这个消息是干嘛用的,比如某用户进入直播间、某用户在直播间购买了某个商品、某用户关注了直播间等等。这样基本上直播就正常使用了,视频活动和聊天功能都得到解决。
- 以上基本完成了一个直播功能,但是一般我们肯定有直播列表,直播记录等等,需要我们去分析直播数据,直播记录和直播数据分析腾讯云直播控制台都可以查询,如果要做也可以调用api使用,由于这个比较复杂,就不说了,需要我们自己根据云直播提供的api去使用。下面就说一个基本上大家都有的功能把:直播间列表(仅显示在直播的直播间)
- 直播间列表这个功能。。。说实话我开始走了很多弯路,因为直播间是我们自己本地库的,状态肯定也是维护在我们自己库里面的,但是主播端呢。。。贼麻烦,各种网络不好啊、app奔溃啊、app卡死啊、手机没电啊、手机爆炸。。。可能就这些把,主要是主播端的各种异常情况,导致用户看播的时候经常出问题。一开始的时候我是想接腾讯云的直播推流拉流回调,然后根据这个回调去调整我们自己库里面的直播间状态,然后我就奔溃了。。。这什么玩意嘛,这个回调一点规律没有,对于主播端异常断网、app奔溃等,很不好用,尤其是那个主播端如果网络不好,经常就会出现我们数据库里直播间状态和实际情况不符,所以我果断放弃使用这个玩意变更直播间状态,这个只用来记录直播的一些日志,比如谁在什么时候推流,什么时候出现了断流,是主播主动断流还是异常情况等等(说个题外话,在做这个的时候,有考虑过心跳方式做这个,但是其实直播的客户端SDK其实和腾讯云是有心跳机制的,所以没必要自己在做,费事)。
- 上面说了一堆废话(我踩过的坑),接下来说一下怎么让直播间列表比较准确的显示出确实是在直播的直播间,我们可以看腾讯云直播的api文档中有一个接口:https://cloud.tencent.com/document/product/267/20472 这个接口可以查询所有正在直播的流,哎?这个接口不就是我们所有正在直播的直播间嘛。。。所以方案就来了,写个定时任务,一分钟请求一波这个接口,获取正在直播中的流,把这个接口里面获取到的正在直播中的流,然后根据腾讯云中提供的正在直播中流,和我们库里面的正在直播状态的直播间做对比,把腾讯中正在直播的而我们库里没有在播的找出来改为正在直播状态,把我们库里在播的而腾讯云接口返回中没有的找出来改为结束直播状态。通过我的实践发现这个接口的数据比较实时,而且这个接口调用频率限制是一秒500次,完全够我们定时任务来处理这个。这样,可以说是很完美的解决了直播列表中直播间状态的问题,而且这个接口有分页功能,也不用担心一次请求数据过大的问题。
以上基本描述完了一个粗糙的直播需求,再说几个需要注意的点:
1.推流和拉流域名仅仅是个域名,不存在对应关系,只要是你这个腾讯云账号的推流和拉流域名,如果你的房间号(StreamName)一样,就算你一个是测试环境的推流地址和测试的appName,你照样有可能在正式环境的那个StreamName下拉到测试环境的推流视频,我就遇到过这个坑,我们测试环境有个直播间号是:100005,正式环境也有一个同样的,结果我们测试环境开播测试,正式环境用户也在开播,结果拉流的时候看到了我们测试环境的直播画面,还好我们都是老实人。。。。
2.断流回调不可靠,最好只用这个记录直播间的直播记录,好用这个记录来查问题,这个回调配置在云直播控制台的:功能模板->回调配置,这个配置新增的时候,记着一个点,不要只配一个回调接口,比如你想配断流回调,那你得推流和断流回调都配,这两个回调用同一个接口就好,回调的参数可以区分是断流还是推流,推流回调比较及时,断流回调比较坑,不要照这个规律
3.腾讯云直播控制台功能还算可以,前端很多数据都可以在控制台查看,比如某个直播间推流拉流相关数据,如帧数、流量、并发连接等等。
此处把直播转码的相关操作补一下:
直播转码就是看播端可以调:标清、高清、原画 这种就是转码,就是看播视频的码率问题吧
先贴出来文档:
https://cloud.tencent.com/document/product/267/20385
https://cloud.tencent.com/document/product/267/32834
如果要配置转码,首先进入腾讯云直播控制台,在左边菜单栏进入:功能模版->转码配置 进去之后根据自己需要配置转码模版,模板名称 配置成简写的英文,方便在拉流地址后面拼接,配置好模版之后,点击云直播控制台的:域名管理 选择你们的拉流域名,点进去之后,在上面有个:模版配置,点击去在右上角点击编辑,在弹出的窗口中选择你配置的转码模版并进行配置,注意这里配置之后会在你的域名里面延时生效。
这里配置完成之后,相当于你的腾讯云直播服务里面已经有了你配置的转码模版,然后在你生成拉流地址的时候,把上面配置的 模板名称 拼接到拉流地址后面,拼接方式为:播放地址_转码模板名称
比如你配置了一个高清模板,模版名称为:hd
原来的播放链接是:http://playxxx.com/live/123456.flv
转码后的播放链接是:http://playxxx.com/live/123456_hd.flv
这样基本就完成了看播转码。
记录一下如果要保证直播效果和流畅度,首先对于直播的流畅度体验,他是依托于一个好的网络(好的上行速率),主播网络上传环境不好,啥都没用,其次就是在我们开发过程中,可以在app端开播是,通过后端接口返回主播开播时设置的各种参数,比如:
参数(手机直播)推荐范围(范围值,均可上下波动)图像组gop2fps30最大码率2000(太高手机性或网络速率能会有影响)最小码率500(太低流畅度无法接受)实际码率1200分辨率根据手机自适应,也可以根据播放效果使用云端转码。
以上参数仅供参考,主要还是靠调试,需要后端动态返回各项参数值,app主播开播时根据效果调配,同时开发人员和主播触达问题也需要靠客户端上报主播的异常,手机异常信息进行分析(可以找腾讯云工单),这个事情需要尝试摸索出最适合的方案。