前言
随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼、虎牙、抖音都随着直播业的大火而欣欣向荣,
大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频直播平台呢?那么针对于这个问题就是我今天想给大家讲解的一些东西,首先要对直播协议有所了解,然后怎么样使用作者研发的surging 去搭建直播平台,首先接下来,我就给大家简单介绍下常见的直播协议。
视频培训地址:https://pan.baidu.com/s/13iojlrnpsknm7ng6boouuw
社区版本开源地址:https://github.com/fanliang11/surging
常见的直播协议
国内常见的直播协议有几个:rtmp、hls、http-flv,下面我们来一一介绍。
rtmp,全称 real time messaging protocol,即实时消息传送协议。adobe 公司为 flash 播放器和服务器之间音视频数据传输开发的私有协议。工作在 tcp 之上的明文协议,默认使用端口 1935。协议中的基本数据单元成为消息(message),传输的过程中消息会被拆分为更小的消息块(chunk)单元。最后将分割后的消息块通过 tcp 协议传输,接收端再反解接收的消息块恢复成流媒体数据。
rtmp 主要有以下几个优点:rtmp 是专为流媒体开发的协议,对底层的优化比其它协议更加优秀,同时它 adobe flash 支持好,基本上所有的编码器(摄像头之类)都支持 rtmp 输出。现在 pc 市场巨大,pc 主要是 windows,windows 的浏览器基本上都支持 flash。另外rtmp适合长时间播放,曾经有过测试,连续 10 天多连续播放没有出现问题。最后 rtmp 的延迟相对较低,一般延时在 1-3s 之间,一般的视频会议,互动式直播,完全是够用的。
当然 rtmp 并没有尽善尽美,它也有不足的地方。一方面是它是基于 tcp 传输,非公共端口,可能会被防火墙阻拦;另一方面,也是比较坑的一方面是 rtmp 为 adobe 私有协议,很多设备无法播放,特别是在 ios 端,需要使用第三方解码器才能播放。
flv (flash video) 是 adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。其格式相对简单轻量,不需要很大的媒体头部信息。整个 flv 由 the flv header, the flv body 以及其它 tag 组成。因此加载速度极快。采用 flv 格式封装的文件后缀为 .flv。
而我们所说的 http-flv 即将流媒体数据封装成 flv 格式,然后通过 http 协议传输给客户端。
http-flv 依靠 mime 的特性,根据协议中的 content-type 来选择相应的程序去处理相应的内容,使得流媒体可以通过 http 传输。相较于 rtmp 协议,http-flv 能够好的穿透防火墙,它是基于 http/80 传输,有效避免被防火墙拦截。除此之外,它可以通过 http 302 跳转灵活调度/负载均衡,支持使用 https 加密传输,也能够兼容支持 android,ios 的移动端。
说了这么多优点,也来顺便说下 http-flv 的缺点,由于它的传输特性,会让流媒体资源缓存在本地客户端,在保密性方面不够好。因为网络流量较大,它也不适合做拉流协议。
上述两个协议都是有adobe公司推出的,而下面要讲的 hls (http live streaming) 则是苹果公司基于 http 的流媒体传输协议。主要应用于 ios 设备,包含(iphone, ipad, ipod touch) 以及 mac osx 提供音视频直播服务和录制内容(点播)等服务。
相对于常见的流媒体协议,hls 最大的不同在于它并不是一下请求完整的数据流。它会在服务器端将流媒体数据切割成连续的时长较短的 ts 小文件,并通过 m3u8 索引文件按序访问 ts 文件。客户端只要不停的按序播放从服务器获取到的文件,从而实现播放音视频。
流媒体协议 rtmp, http-flv, hls 简单对比
协议 | 传输协议 | 格式 | 延时 |
rtmp | tcp | flv | 1-3秒 |
http-flv | http | flv | 1-3秒 |
hls | http | m3u8 | 4-10秒 |
rtmp 协议为流媒体而设计,在推流中用的比较多,同时大多 cdn 厂商支持rtmp 协议。
http-flv 使用类似 rtmp流式的 http 长连接,需由特定流媒体服务器分发的,兼顾两者的优点。以及可以复用现有 http 分发资源的流式协议。它的实时性和 rtmp 相等,与 rtmp 相比又省去了部分协议交互时间,首屏时间更短,可拓展的功能也更多。
hls 作为苹果提出的直播协议,在 ios 端占据了不可撼动的地位,android 端也同时提供相应的支持。
如何架构实现
rtmp 协议架构图
调度服务网关是针对于外网服务调用, , 提供基于rest 查询流对应的服务器地址。
直播终端通过调度服务网关获取的rtmp 服务地址,通过地址进行推流,rtmp服务获取到数据后,然后转推到其它的rtmp服务上,rtmp再把流推给订阅的客户端
http-flv 架构图
以上是通过rtmp 服务转推给http-flv 订阅的客户端
基于surging 微服务引擎如何实现
比如现在需要获取live1/livestream直播地址, 那么首先可以通过地址/locate 获取wanip外网地址, routepath 是rtmp服务的服务路由路径,key是直播需要传过去地址livestream,然后rtmp 端口定义为76,那么接下来获取的地址就是
http://192.168.249.103:76/live1/livestream
surging 需要引用livestream 模块,这样就能支持直播协议rtmp,http-flv,hls(暂时还未实现),然后还需要通过配置surgingsetting, 配置如下:
"livestream": { "rtmpport": 76, //rtmp 端口 "httpflvport": 77, //httpflv 端口 "enablelog": true, //是否启用log "routetemplate": "live1", //直播服务路由规则名称,可以根据规则设置,比如集群节点2,可以设置live2, 集群节点3,可以设置live3 "clusternode": 2 //集群节点数里,会根据routetemplate 转推流 }
然后可以通过ffmpeg或者obs进行推流,以ffmpeg 工具为例,可以输入以下命令
ffmpeg -re -i 3.mp4 -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ar 44100 -ac 2 -f flv rtmp://127.0.0.1:76/live1/livestream2
客户端采用potplayer进行播放,比如可以添加地址rtmp://127.0.0.1:76/live1/livestream2 ,如果你部署了另外一台rtmp服务,设置的是65端口,那么可以添加
rtmp://127.0.0.1:65/live1/livestream2进行播放
可以支持一台n个推流,n个订阅播放,如下图:
总结
surging 现在分为两个版本,一个是社区版本surging ,一个是企业版本microsurging/surgingvista, 企业版不仅功能强大,支持流媒体服务等协议组件和中间件,并且还支持多语言定制化需求,完全可以满足各大公司的需要,如有意见,可以和作者联系。
发表评论