视频帧:
- 在MPEG编码的过程中,部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法,也称为“关键帧”压缩法。
- 两个I帧之间的长度就是一个GOP的长度。
- I帧:又称Intra-Picture。帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧。I帧通常是每个GOP的第一个帧,经过适度的压缩,可以当成图像。I帧实际上就是完整的图像经过压缩后的数据帧。
- P帧:又称Predictive-Picture。称帧间预测编码帧,需要参考前面的I帧才能进行编码。 通过充分的降低图象序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫前向预测帧。这个帧不能单独作为图像进行观看,其不能成为完整的一张图,需要参考前面一张I帧或B帧来形成完整图。
- B帧: 又称Bi-directional interpolated prediction frame。 既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧,也同样不能成为完整的一张图,需要参考前面的I或P帧以及后面的一个P帧来形成一张完整的图。
常见点播文件格式
FLV、mp4、TS。
FLV(FLASH VIDEO):
- FLV是流媒体格式的一种,FLV是一个二进制文件,FLV封装格式是由一个文件头(flie header)和 文件体(file Body)组成。。
- Flv body是由很多tag组成,tag又分成三种类型:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
- FLV文件=FLV头文件+ tag1+tag内容1 + tag2+tag内容2 + …+… + tagN+tag内容N
- FLV包括文件头(File Header)和文件体(File Body)两部分:
- FLV tags结构:| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |。 当前帧时戳,单位是毫秒。相对于FLV文件的第一个TAG时戳。第一个tag的时戳总是0。——不是时戳增量,rtmp中是时戳增量。
- Metadata Tag:该类型Tag又通常被称为Script Tag Data。会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。
- 如回包的content-length不加,则持续回包即直播
MP4:
mp4或称[MPEG-4]第14部分(MPEG-4 Part 14)是一种多媒体容器格式。
MP4文件中的所有数据都装在box中。也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。
“ftyp”类型box:一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息
“moov”类型box:之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息
“mdat”类型box:MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,媒体数据的结构由metadata进行描述。
TS:
- MPEG-2中规定TS传输包的长度是固定的,长度为188字节。
- 所有的TS包都分为包头和净荷部分。
- 包头:提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。
- 净荷:所传输的信息包括两种类型:视频、音频的PES包以及辅助数据;节目专用信息PSI。分为三层:ts层(Transport Stream)、pes层(Packet Elemental Stream)、es层(Elementary Stream)。
- es层:就是音视频数据
- pes层:是在音视频数据上加了时间戳等对数据帧的说明信息
- ts层:是在pes层上加入了数据流识别和传输的必要信息。
TS形成过程:
- 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)
- 对ES(基本码流)进行打包形成PES
- 在PES包中加入时间戳信息(PTS/DTS)。 DTS(Decoding Time Stamp)解码时间和PTS(Presentation Time Stamp)显示时间。
- 将PES包内容分配到一系列固定长度的传输包(TS Packet)中
- 在传输包中加入定时信息(PCR)。在传输包中加入节目专用信息(PSI)。 其中PSI表有4种类型:节目关联表(PAT)、节目映射表(PMT)、网络信息表(NIT)和条件访问表(CAT)
- 连续输出传输包形成具有恒定比特率的MPEG-TS流
常用直播协议总结
RTMP:
- RealTime Messaging Protocol,实时消息传送协议。工作在TCP之上的明文协议,使用端口1935。传送的协议,负载的是flv格式的文件。
- RTMPT封装在HTTP请求之中,可穿越防火墙。RTMPS类似RTMPT,但使用的是HTTPS连接。
- 消息是rtmp的基本数据单元,块是用于将消息重新封装在网络上传输。
消息:
- 是rtmp的基本数据单元,服务端和客户端通过在网络上发送RTMP消息进行通讯。消息可能包含音频,视频,数据,或其他的消息。RTMP消息,分为消息头和载荷两部分。
- 消息头:message type、payload length、timestamp、stream id。
- 载荷:载荷中消息中包含的真实数据。例如,它可以是音频样本或压缩的视频数据。
chunk:
- chunk(消息组成):消息是rtmp协议的基本数据单元,在网络传输时,消息会被重新封装成块进行传输,每个块都有固定的大小,如果消息大小大于块的大小,消息就会被拆分成几个块发送。块由块头和载荷组成。
块头:basic header(fmt、cs id)、chunk msg header(timestamp、message length、message type id、message stream id)、extended timestamp - 载荷:块的载荷就是消息的载荷内容。
rtmp的消息类型:
- rtmp的消息类型可分为三大类:协议控制消息、用户控制消息、RTMP命令消息
- 协议控制消息:设置块大小消息(Message Type=1)、终止消息(Message Type=2)、确认消息(Message Type=3)、确认窗口大小消息(Message Type=5)、设置对端带宽消息(Message Type=6)
- 用户控制消息:用户控制消息(Message Type=4)
- RTMP命令消息:数据消息(Message Type=18或15)、共享对象消息 (Message Type=19或16)、音频消息 (Message Type=8)、视频消息 (Message Type=9)、聚合消息(Message Type=22)、命令消息(Message Type=20或17)
HDL:
- HTTP+FLV将RTMP封装在HTTP协议之上的,可以更好的穿透防火墙等。
- FLV是最简单的流媒体封装,HTTP是最广泛的协议,这两个组合在一起维护性更高,比RTMP简单多了。
- HTTP协议中有个约定:content-length字段,http的body部分的长度。服务器回复http请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了。如果服务器回复http请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的socket连接断开。
- http-flv直播就是利用第二个原理,服务器回复客户端请求的时候不加content-length字段,在回复了http内容之后,紧接着发送flv数据,客户端就一直接收数据了。
HLS:
- HTTP Live Streaming,是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。
- 它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。
- 在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。视频的封装格式是TS。
- 在stream segmenter模块将视频切片,切片的结果就是index file(m3u8)和ts文件了。
- hls最大的优点HTML5可以直接打开播放;这个意味着可以把一个直播链接通过微信等转发装任何独立的APP,有浏览器即可。
优势:
- 主要是为了解决RTMP协议存在的一些问题。比如RTMP协议不使用标准的HTTP接口传输数据,所以在一些特殊的网络环境下可能被防火墙屏蔽掉。但是HLS由于使用的HTTP协议传输数据,不会遇到被防火墙屏蔽的情况(该不会有防火墙连80接口都不放过吧)。
- 另外于负载,RTMP是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。而HLS基于无状态协议(HTTP),客户端只是按照顺序使用下载存储在服务器的普通TS文件,做负责均衡如同普通的HTTP文件服务器的负载均衡一样简单。
- 另外HLS协议本身实现了码率自适应,不同带宽的设备可以自动切换到最适合自己码率的视频播放。
播放模式:
- 点播VOD的特点就是当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的m3u8的结构。
- Live 模式就是实时生成M3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。
- 客户端在播放VOD模式的视频时其实只需要下载一次一级index文件和二级index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次二级index文件,然后下载ts文件,再下载二级index文件(这个时候这个二级index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。
HDS:
- Http Dynamic Streaming,是一个由Adobe公司模仿HLS协议提出的另一个基于Http的流媒体传输协议。
- 其模式跟HLS类似,但是又要比HLS协议复杂一些,也是索引文件和媒体切片文件结合的下载方式。
- 多码率适应场景
DASH:
- Dynamic Adaptive Streaming over HTTP。
- DASH协议原理跟HLS协议差不多,都是将文件分成一片片小段进行分发,也是分为MPD索引文件和媒体分片文件。
- 多码率适应场景
QUCI:
- Quick UDP Internet Connection。 是谷歌制定的一种基于UDP的低时延的互联网传输层协议。
- QUIC很好地解决了当今传输层和应用层面临的各种需求,包括处理更多的连接,安全性,和低延迟。
- QUIC融合了包括TCP,TLS,HTTP/2等协议的特性,但基于UDP传输。
- QUIC的一个主要目标就是减少连接延迟,当客户端第一次连接服务器时,QUIC只需要1RTT(Round-Trip Time)的延迟就可以建立可靠安全的连接,相对于TCP+TLS的1-3次RTT要更加快捷。
- 针对金山云涉及nginx改造,通过lvs-caddy-nginx,通过caddy代理支持
RTSP:
- RealTime Streaming Protocol,实时流传输协议。RTSP定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。
协议目的在于控制多个数据发送连接,为选择发送通道如UDP、组播UDP与TCP提供途径,并为选择基于RTP、RTCP上发送机制提供方法。 - 适合IPTV应用场景。
- RTSP与RTP协议最大却别,RTSP是一种双向实时数据传输协议,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作。
RTP:
- Real-timeTransport Protocol,实时传输协议。RTP是针对多媒体数据流的一种传输层协议,详细说明了在互联网上传递音频和视频的标准数据包格式。
- RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通系统(配合H.323或SIP),使它成为IP电话产业的技术基础。
- RTP是建立在UDP协议上的,常与RTCP一起使用,其本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。
RTCP:
Real-timeTransport Control Protocol,实时传输控制协议。RTCP是RTP的配套协议,为RTP媒体流提供信道外的控制。
RTCP的主要功能是为RTP所提供的服务质量(QoS)提供反馈,收集相关媒体连接的统计信息,例如传输字节数,传输分组数,丢失分组数,单向和双向网络延迟等等。