腾讯云直播面试时的问题和解答

来源:互联网 发布:百度地图经纬度数据库 编辑:程序博客网 时间:2024/05/22 01:36

1.直播功能????

 

答:我们这个项目里的直播采用的是集成腾讯云直播SDK进行的,因为在直播中可能会涉及到弹幕和刷礼物等功能所以还需要集成腾讯的IM即时通信,并且通过腾讯云服务,直播的流程大概由以下几个步骤组成,采集、编码、封装、主播推流到服务器、服务器通过CDN对流进行分发、解码、观众进行拉流观看直播。

采集其实就是通过设备的摄像头对图像进行采集并进行处理,麦克风对音频进行采集并处理,在这个步骤里,我们一般采集到的图像是YUV或者是RGB格式,而音频采集采集到的一般是PCM格式的

当采集完之后的视频内存是相当大的,大概一个7s的视频会有800M的内存占用,可以想象一下,800M的视频只有7s,先不说用户的体验怎么样,就说我们往服务器推流的时候是十分缓慢的,所以要对视频进行编码,我觉得编码就是对视频进行压缩,我们都知道,编码无非就是硬编和软编,腾讯云直播用的就是软编,底层有一系列的算法,最终会将原始视频转化成H264格式的数据,转换过后视频就只有大概708k,腾讯做的挺好的,同时,音频通过脉冲编码机制转换成PCM格式的。其实在做视频编码的时候也奉行了去除多余图像的原则,比如说有可能图像与图像之间有较大的相关性,可以去除一些,还有人的视觉有时候对一些图像的感知并不是那么强,所以也可以去掉。

然后就是封装,其实封装就是把视频和音频进行合并的过程,封装之后的的音视频在我们这个项目里是FLV格式的,因为RTMP实时消息传输协议在网络较好的情况下延迟较低,所以我们通过RTMP进行实时传输的,毕竟是直播嘛,肯定得实时上传,这个协议也是基于TCP实现的,需要先将FLV进行打包,以后就成为了RTMP格式的了

视频压缩后,还是比较适合进行直播的,所以当我们的主播想要进行直播的时候会自己的房间名称之,主播ID等一些信息编写成一个JSON串向服务器发送直播请求,服务器会实时的给主播返回一个推流的URL,这个时候就可以直接把推流到服务器。

当服务器拿到主播推过来的流之后,会通过CDN流分发进行传输,这个传输和推流使用的也是RTMP协议进行的。这里腾讯云后台有很好的实现。所以一般我们是不用考虑的。

拉流的话就比较简单了,当观众想看某场球赛的时候,会向服务器发起拉流的请求,同时服务器会给观众返回一个JSON串,这个串里面有主播的信息,和所有在看主播直播的观众的信息,以及最重要的拉流地址,拿到拉流地址之后为了视频的安全性,所以我们内部封装了一个防盗链的算法,大概是基于当前的时间戳,以及服务器返回的JSON串中有一个唯一的sissionId生成的,进行计算,之后会用防盗链和拉流地址进行拼接拿到真正的拉流地址,通过腾讯云的TCLVoideView实现拉流观看直播。

 

 

问:你们的项目中有没有连麦功能?

 

答:没有。但是我对于连麦也有一点了解,连麦其实就是混流,主播和连麦者是通过P2P进行交互的。我有说过在集成腾讯云SDK的时候同时也集成了腾讯的IM 即时通信的,连麦者向主播发起连麦请求的时候,主播弹出diglog之类的对话框进行提醒,如果主播同意的话会向连麦发消息告诉连麦者接受连麦,连麦者会向服务器发起请求,服务器会实时给连麦者返回连麦者的推流地址,连麦者实现推流之后,CDN内部会对主播的推流地址和主播的拉流地址进行合并也就是所谓的混流,之后观众拉到流就是一个混流,直接就可以观看进行连麦的房间。

 

问:你们的直播支持多少房间同时在线直播?稳定性怎么样?

 

答:因为我们的项目是集成了腾讯的云直播SDK的,支持上万人同时在线直播应该不是问题,之后如果公司发展好的话,估计会有很多比赛同时进行,稳定性的话,现在因为同时进行的直播还达不到那么多,还没有什么稳定性的问题,即时多了,我觉得腾讯的 马化腾还是可以的。

 

问:弹幕是怎么实现的?

 

答:弹幕我们是直接用的哔哩哔哩开源的一个比较成熟弹幕框架DanmakuFlameMaster据说斗鱼也是这个框架,因为项目是集成了IM的,所以在主播开播的时候其实同时创建了一个群组聊天,当然在登录我们APP的时候肯定是同时登陆了IM的,观众在进入直播间的时候,同时也加入了一个群组,当发送弹幕的时候会向群组发消息,DanmakuFlameMaster中的danmuView是可以直接添加弹幕的,接收到消息的主播和观众都会向它添加一条弹幕,之后就直接更新UI了。

 

问:刷礼物是怎么实现的?

 

答:刷礼物和弹幕的原理是一样的,都是通过IM发消息,接收到消息时,会实时的更新UI,进行动画展示,根据所刷的礼物不同,数量不同会做出判断,展示不同的效果。

 

问:这么多消息是怎么判断究竟应该怎么做操作呢?

 

答:其实我们在发消息的时候是发的一个JSON串,这个串里面有一个action,同时我们在项目中也管理了一个有关action的类,判断action做出相应操作。