通过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。
具体要结合不同的场景采用对应的协议。