直播原理:(按顺序)
- 通过PC / Android / IOS 端采集
- H.263/AAC 压缩编码, 用于大多数的直播编码。
- 字幕叠加
- 推流
- CDN
- PC / Android / IOS 回放
格式\浏览器 | Chrome | Firfox | Safari |
---|---|---|---|
mp4(兼容性最好) | 支持 | 支持 | 支持 |
webm | 支持 | 支持 | |
hls | 支持 | ||
flv(B站的视频格式) |
所用协议: 对应视频格式
HLS协议 -> hls格式
RTMP协议 -> flv格式
HTTP-FLV协议 -> flv格式
因此 hls 和 flv 视频格式比较适合做直播
对于HLS协议
提供一个M3U8索引文件,给html中的video标签
video解析M3U8文件,而M3U8中存的是很多片段,而这些片段是一个直播流的分段
M3U8文件中有很多索引(.ts 文件),每个对应时间一个播放时长,然后浏览器会以这些时间和为依据,去重新更新M3U8文件
Ps. M3U8文件内部可以嵌套M3U8 文件
M3U8 分为 动态列表(live playlist)
,静态列表(几乎不用)
,全量列表(vod playlist)<- (M3U8文件不会变化的列表)
。
M3U8 文件 是一个纯文本文件。 第一行就是M3U8版本,对于浏览器解析,必须注意版本。
EXTINF: %d %d 代表的是下面的连接请求的时间 与浏览器更新时间有关
EXT-X-MEDIS-SEQUENCE 代表动态列表的序号,每次+1
EXT-X-PLAYLIST-TYPE:VOD 是全量列表中用 代表的是点播
EXT-X-ENDLIST 全量列表中的 代表结束
.ts 文件
.ts文件内部有一个PAT包,指引你找到一个PMT的包
PMT包会告诉你哪些是音频,哪些是音频。
很多的TS组成PES
TS再按照视频音频文件分别组成一个一个有顺序的帧
PAT,PMT,PES 组成 .ts 文件
HLS协议(好用但有延时)
RTMP协议(实时消息传输协议)
如果是通过客户端采集,大多用RTMP协议 效率稍微高一点
如果是web端口,大多用WebRTC协议
源到客户端用的是TCP方式传输,传输过程中也是flv格式
也有的用到HTTP-FLV协议传输,这个低延时同时:
- 可以再一定程度上避免防火墙的干扰(例如:有的机房只允许通过80端口通过)
- 可以很好的兼容HTTP 302跳转,做到灵活调度
- 可以使用HTTPS做加密通道
- 很好的支持移动端(Android,IOS)