什么叫推流?
推流是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,若是网络不稳定,直播效果就会不好,观众观看直播时就会发生卡顿等现象,观看体验非常糟糕。算法
要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。经常使用的流传输协议有RTSP、RTMP、HLS等,使用RTMP传输的延时一般在1–3秒,对于手机直播这种实时性要求很是高的场景,RTMP也成为手机直播中最经常使用的流传输协议。最后经过必定的Qos算法将音视频流数据推送到网络断,经过CDN进行分发。数据库
扩展资料:
直播中使用普遍的“推流协议”通常是RTMP(Real Time Messaging Protocol——实时消息传输协议)。该协议是一个基于TCP的协议族,是一种设计用来进行实时数据通讯的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通讯。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。缓存
在高精尖沙龙直播中,最初使用传统设备进行“推流”。服务器
具体过程就是:经过网线将EFP系统中的切换台、网络编码器、笔记本按顺序链接,链接完成后确保笔记本电脑的IP地址和网络编码器的地址在同一网段,而后在电脑页面上对编码器的各类“推流参数”进行调整,为保证正常“推流”,还需设置网络推流地址,输入推流地址、直播地址、视频模式、分辨率、码率、播放域名、播放地址等内容。设置完毕后确认IP地址,再进行网络测速,并确保网络与网络编码器链接正常。此种“推流”所需设备过多,出现问题后十分麻烦,须要对设备进行逐一排查,极耗费时间。网络
后来,将直播系统改成Livestudio系统,“推流”内置在Livestudio的软件之中,整个“推流”过程再也不须要额外的网络编码器和笔记本等设备,也无需再设置IP,只要网络正常,联网便可完成操做,还可根据网络的实际状况设置“推流”的质量以知足要求。此种操做十分便捷,有效避免了上述问题的出现。负载均衡
推流
推流必须把音视频数据使用传输协议进行封装,变成流数据。
经常使用的流传输协议有RTSP、RTMP、HLS等,使用RTMP传输的延时一般在1–3秒,对于手机直播这种实时性要求很是高的场景,RTMP也成为手机直播中最经常使用的流传输协议。最后经过必定的Qos算法将音视频流数据推送到网络断,经过CDN进行分发。
在直播场景中,网络不稳定是很是常见的,这时就须要Qos来保证网络不稳状况下的用户观看直播的体验,一般是经过主播端和播放端设置缓存,让码率均匀。另外,针对实时变化的网络情况,动态码率和帧率也是最经常使用的策略
推流实现方案
网络传输方面所有本身作花费较大(基本不现实)
国内提供推流服务的CND服务商云视频服务商
阿里云是国内惟一能自研CDN缓存服务器的厂商,性能仍是很是优越
大多数直播平台都会同时接入多个视频云服务提供商,这样能够作拉流线路互备,对推流后视频集群再进行优化也可提升直播的流畅性和稳定性。
趣拍直播SDK依托阿里云的CDN和趣拍成熟的直播技术保障直播快速接入APP。
CDN
基本原理是普遍采用各类缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工做正常的缓存服务器上,由缓存服务器直接响应用户请求。
内容分发网络(CDN)是一个经策略性部署的总体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件。
内容分发技术
分段分发技术异步
流媒体对边缘内容的完整性没有要求,节点只需存储少许的节目或节目片断便可实时推送内容,为用户提供完整的服务。当用户点播的内容只有部分片断或没有时,系统将采用分发技术进行内容的快速分发。
部分分发技术分布式
部分分发技术可提高边缘系统的命中率,若是对10%的内容采用全复制,20%的内容采用50%复制,50%的内容采用10%复制,那么,系统能够实现95%以上的命中率,大大下降骨干网的负荷,具备优越的分发性能。
负载均衡技术编辑
负载均衡是整个CDN的核心,负载均衡的准确性和效率直接决定了整个CDN的效率和性能。 负载均衡技术将网络的流量尽量均匀地分配到几个能完成相同任务的服务器或网络节点上进行处理,避免部分网络节点过载而另外一部分节点空闲的不利情况,既能够提升网络流量,又能够提升网络的总体性能。
CND技术点
内容发布:它借助于创建索引、缓存、流分裂、组播(Multicast)等技术,将内容发布或投递到距离用户最近的远程服务点(POP)处;
内容路由:它是总体性的网络负载均衡技术,经过内容路由器中的重定向(DNS)机制,在多个远程POP上均衡用户的请求,以使用户请求获得最近内容源的响应;
内容交换:它根据内容的可用性、服务器的可用性以及用户的背景,在POP的缓存服务器上,利用应用层交换、流分裂、重定向(ICP、WCCP)等技术,智能地平衡负载流量;
性能管理:它经过内部和外部监控系统,获取网络部件的情况信息,测量内容发布的端到端性能(如包丢失、延时、平均带宽、启动时间、帧速率等),保证网络处于最佳的运行状态。
需求背景
看宝宝与明日之星是贝聊的视频直播产品,目前只是使用七牛一家的直播云服务。基本业务是经过摄像头设备或老师的手机直播,推流到七牛,家长经过H5的页面观看。业务流程图以下:
能够明显发现:贝聊服务端和客户端都彻底依赖七牛云的服务,万一七牛云出现故障,整个视频直播产品就瘫痪了!因而咱们的需求就诞生了:接入另外一家直播云服务商,提升服务可用性。如此一来,既可作为容灾,也可作流量切换。
直播云服务商选择
通过调研,咱们锁定的备选服务商有腾讯云、阿里云、金山云、网易云。新的直播云服务商选择,不能拍脑壳决定。须要考虑各服务商的优缺点、成本以及是否能知足咱们的功能要求等。总结主要有如下几点:
客户端的限制:咱们的贝聊老师版APP,安卓系统要求最低是版本4.0,而阿里云和网易云要求最低版本是4.3
现有功能点的限制:产品已经上线,新的服务商应与七牛的功能类似,包括推拉流、鉴权、定时截图、状态回调通知、保存回放等
成本的问题:腾讯云成本最高,阿里云和金山云相对较低
因为客户端的限制,备选服务商基本锁定在腾讯云和金山云。既然是做为备用,成本就是次要因素了,稳定可靠才是咱们的核心关注点。所以,咱们最终选择了腾讯云做为备选直播服务商。
实现过程
接入一家新的直播云服务商,业务流程图调整以下:
3.1 业务变化ide
后台增长操做功能,可切换服务商和客户端使用的SDK。目前只有人工切换服务商,后续能够加入系统检测报警机制,并自动进行切换。但若彻底靠系统自动切换,会有误报风险。性能
直播是以节目为单位,在建立节目时增长一个字段标识使用哪一个服务商。后续一切操做,例如:生成推流地址、拉流地址、截图、保存回放都调用这个服务商的接口。
推流地址是服务器生成并签名后返回给客户端,客户端无需关心使用的服务商,只需关心使用哪一个SDK。优先使用腾讯云SDK,因为没法保证其稳定性,因此前期同时接入七牛云和腾讯云的SDK,由后台配置各自使用比例。
增长对腾讯云回调通知的处理
包括推流状态回调、截图回调、生成录制文件回调。一个节目有一个流空间,七牛云和腾讯云的流空间是全局惟一的,因此不论是七牛云仍是腾讯云的每一个回调都能准确的找到对应的节目。
生成回放的方式彻底不一样。七牛云是在直播结束时调用接口生成的,而腾讯云是在推流地址后加参数&record=mp4&record_interval=5400,而后接收回调。腾讯云还能够配置全局的推流自动保存。
腾讯云区分生产环境和测试环境。腾讯云的回调通知是全局配置的,没法区分环境,使用多个帐号又增长成本,因而把回调通知都配置成生产环境的,调用异步处理接口时把taskId存到数据库,生产环境找不到则转发到测试环境。 3.2 代码结构变化
最初只接入一家服务商,代码结构比较简单。现在,为了不有重复代码,过多使用if、else,因此使用了简单工厂模式。业务代码统一调用工厂类VideoTV3rdLiveServiceFactory,七牛云和腾讯云各写了一套业务代码,分别是VideoTVQcloudLiveService和VideoTVQiniuLiveService,实现生成推流地址、获取拉流地址、保存回放等与业务相关的逻辑代码。QcloudService是对腾讯云API和SDK的封装,PiliService和StorageService是对七牛云SDK的封装。
后续工做
实现系统故障检测报警。系统定时尝试推流,若是失败累计达到n次后发送邮件、短信报警。
有新的业务需求须要实现两套,分别对接七牛云和腾讯云。