分布式直播系统(一)【协议基础篇】
转载请注明出处:https://blog.****.net/impingo
项目地址:https://github.com/im-pingo/nginx-rtmp-module
流媒体基础概念介绍
最简单的直播系统
在讲直播服务器之前我们先大概描述一下最简单的直播场景(单点流媒体服务器),如下图所示主播使用rtmp工具推流,观众使用相应的拉流协议拉流。
协议介绍
rtmp协议
流式协议,所谓流式是指rtmp协议在传输过程中是将一整帧完整数据分割成大小基本相等的小块(chunk)传输,支持推流和拉流操作,目前adobe已经停止对该协议进行升级,所以rtmp是不支持一些比较新的音视频编码的(例如 h265 vp8 vp9 等等,但是国内的CDN厂商一般会对rtmp协议做私有扩展,使其能够支持h265编码)。
http-flv协议
这是一种更简单直播方式,实现原理是对于http下载请求,如果http头中没有content-length字段,则http客户端就会一直接受服务器传来的数据,直到服务器将tcp连接断开。试想一下,如果http服务器在播放器请求的时候先返回flv文件头,然后接着返回最新的直播内容,播放器就可以一直直播下去,直到服务器断开连接。
hls协议
一种基于http下载操作的媒体协议,简单概括一下就是,服务器端会动态生成一个m3u8文本文件和多个mpegts(一种媒体封装格式)切片文件,m3u8文本中包含这些切片的路径,试想一下,如果服务器不停产生新切片并且删除老切片,通知更新m3u8文件,这样m3u8文件中描述的mpegts文件就是当前最新的直播内容。客户端的行为是只需要不停请求m3u8文件并且发现如果m3u8文件内容发生变化就下载新的mpegts文件进行播放。
其他协议
其他直播协议还有DASH、http-ts、http-fmp4,甚至当今比较火的实时性更高的webrtc协议。
这些协议和系统的教程将在完成rtmp、http-flv、hls协议系统的架构后开展。
总结
协议 | 场景 | 延时 |
---|---|---|
rtmp | flash、ffplay、vlc等终端播放器 | 2s+((如果取消缓存也可以做到1s左右延时)) |
http-flv | flash、ffplay、vlc等终端播放器,当然也有h5播放方案(利用mes方案,如flv.js,以后会介绍具体实现方式) | 2s+(如果取消缓存也可以做到1s左右延时) |
hls | 几乎支持所有终端播放器(包括html5) | 5s+ |
http-ts | 与http-flv非常类似,只不过是利用http协议分发ts媒体流 | 同http-flv |
下一篇将介绍如何搭建一个支持http-ts、http-flv、rtmp、hls、dash协议的流媒体服务器。