Html5直播(1): 直播原理

 通过PC端或移动端,对于采集来说,PC为主。对于源的质量,会买一些专业的设备,保证一定的分辨率到终端的时候非常清楚。

收集完后是一个原始的2进制数据流,经过websocket或http等上传到服务器进行上图处理的4个步骤。

最常见的是涉及到编码的问题,原始的流是不能直接让播放器去播放的,必须采用一定的协议去做编码。

视频压缩编码的常见的格式:H.264(视频编码)、AAC(音频编码)

一般直播流播出失败的时候最容易想到的排查点是编码是否正确。

编码后一般会有字幕的叠加和水印等。

后期是推流,推送到服务器上去,服务器再部署推到CDN上,静态资源发布到CDN保证拉取速度。

CDN就是用户直接访问的直播的地址。

视频格式与浏览器:

格式\浏览器 Chrome Firfox Safari
mp4 支持 支持 支持
webm 支持 支持  
hls     支持
flv      

mp4兼容性很好,但直播一般都不用mp4

hls是视频协议

直播协议:

  • HLS协议:视频格式hls
  • RTMP协议:视频格式flv
  • HTTP-FLV协议:视频格式flv

hls和flv偏直播,也可以做点播。

1.HLS协议:

苹果推出的协议。

借助video便签去播放,以前是借助flash。

video会怎么播?

对于hls协议,会给一个M3U8文件,只给扔给video.

HLS协议就是讲述直播的,和其他点播的最大的区别不会一下给你一个视频地址,而是给你1个M3U8索引文件,video便签是不支持M3U8文件的识别,只有Safari浏览器可以。可以将M3U8文件解析为1个个片段,每个片段就是直播流的分段。

然后就涉及到M3U8文件的更新问题,因为直播是实时的,

就涉及到播放时长(更新)的问题,就以上面来说,假设segment-1.ts需要2s,segment-2.ts需要2s,segment-3.ts需要3s,segment-4.ts需要2s,那么一共就需要9s,在9秒之前播放器会重新请求更新M3U8文件(浏览器自己的行为),更新后里面的M3U8文件就变了。

M3U8文件里面不一定包含.ts文件,可能嵌套了M3U8文件。

M3U8还细分为动态列表live playlist、静态列表event playlsit、全量列表vod playlist

实际直播很少使用静态列表。

全量列表,就是拿到的是一个不变化的。

一般动态列表就是纯文本的文件,不是动态的流,例如:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26
#EXTINF:9.901,
http://media.example.com/wifi/segment26.ts
#EXTINF:9.901,
http://media.example.com/wifi/segment27.ts
#EXTINF:9.501,
http://media.example.com/wifi/segment28.ts

第一行表明了M3U8的版本,要看播放器支持的HLS版本是多少。

然后是默认的时长和序号。SEQUENCE+1

和大概的视频片段时长是多少。

静态列表,类似于:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAULIST-TYPE:EVENT
#EXTINF:9.9001,
http://media.example.com/wifi/segment0.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment1.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment2.ts

和动态列表的区别是多了一行:

#EXT-X-PLAULIST-TYPE:EVENT。

而全量列表比动态列表多了2个东西:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TRAGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAULIST-TYPE:VOD
#EXTINF:9.9001,
http://media.example.com/wifi/segment0.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment1.ts
#EXTINF:9.9001,
http://media.example.com/wifi/segment2.ts
#EXT-X-ENDLIST

#EXT-X-PLAULIST-TYPE:VOD(表明结束)

#EXT-X-ENDLIST(表明点播)

告诉浏览器不用去自动更新M3U8文件了,我就是静态的,只有一个,没了。

ts文件:

每个ts文件,对于第一个ts文件会有一个叫PAT的包,告诉去找PMT的包,PMT告诉说哪个是TS包,哪些是视频,哪些是音频,TS包相连组成“帧”。哪些TS包组成帧,需要解析TS规范,TS里的Header会有这个信息。

2.RTMP协议:

RTMP(Real Time Messaging Protocol)实时消息传输协议。

基于TCP,是一个协议族,包括RTMP基本协议、RTMPT/RTMPS/RTMPE等多种变种。

RTMP是一种涉及用来进行实时数据通信的网络协议,主要用来在Flash、AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

传统的软件和服务器交互主要是用RTMP,PC端如果不是通过web方式,而是通过客户端来做,基本走RTMP。如果采集端是用web方式,走WebRTC。这是2个不同的技术方案。

 

RTMP协议关键是采集和源是非常相似的,从用户端到源这块如果也走RTMP,则源PC端是不变的。RTMP协议传输过程种也是FLV格式的。无非就是通信的手段不一样。

但是RTMP使用起来i相对复杂。

3.RTMP的升级版HTTP-FLV协议:

HLS简单不需要像RTMP那样处理应答,但是实时性差、延时高。

如果说延时大而又不想过多的切分片,那么久可以选择HTTP-FLV协议.

集合HLS优点、RTMP低延时的特性。

和RTMP的区别是都是长连接,中间传输的格式都是FLV,唯一的区别是在播放器和CDN建立连接通过HTTP请求:

HTTP-FLV协议的优点是可以在一定程度上避免防火墙的干扰、很好的兼容HTTP 302跳转,做到灵活调度、可以使用HTTPS做加密通道、很好的支持移动端。但是其视频格式是FLV。

具体要结合不同的场景采用对应的协议。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章