-
h.264分为两部分组成:VCL 和 NAL
VCL: 是指如何进行视频压缩算法的纯视频流的部分,这里不做说明(这里是大公司给完成的部分)
NAL:是指网络抽象层部分(Network Abstraction Layer Units),说白了是给每个序列加入一个头信息;方便网络传输。
举个例子:比如我们寄快递一样,VCL指你要邮寄的东西,NAL是你的包装盒和邮寄单信息,而这里的RTSP好比是快递公司。
小结:做编码器的人关心的是VCL部分,做视频传输和解码播放的人关心的是NAL部分。 -
一些概念:
I帧:非参考帧,一般为第一帧
B帧:前后帧都做参考
P帧:只参考前一帧
像素->码流:像素—宏块—片(slice)—帧 — 序列 — 码流
序列(seqence):LSPS(14字节) + LPPS(4字节) + Lsei (5字节)+ 1I帧 + 若干P帧
一个序列的数目好比是帧率;比如帧率是30Hz,那么这个序列就是 1I帧 + 29个P帧。
一段H.264的码流其实就是多个seqence组成的,SPS,PPS和sei描述的是sequence的图 像信息,I帧是关键,丢了I帧这个sequence就废了,每个sequence只有一个I帧。
分隔符:在NAL中序列参数集和图像参数集开头都会有个00 00 00 01这个的分割符;
Profile:在psp中包含了这个参数,主要是定义了编码工具的集合(使用的哪种算法)
Level:主要是对码流的关键参数,取值范围。比如分辨率 -
RTSP概述
RTSP(Real Time Streaming Protocol),参考标准为 RFC2326,RTSP 协议是基于文本 的实时流传输协议,是 TCP/一个应用层协议。
图解
传输过程
RTSP 消息格式
1 请求格式(Request)
2 回应消息格式(Response)
RTSP中的 C(Client)与 S(Server)交互流程图解
4、RTSP 关键字段说明
4.1 关键字:OPTIONS
得到服务器提供的可用方法(OPTION、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE、GET_PARAMETER、SET_PARAMETER)。
4.2 关键字:DESCRIBE
请求流的 SDP 信息。
注解:此处需要了解 H264 Law Data 如何生成 SPS PPS 信息。
4.3 关键字:SETUP
客户端提醒服务器建立会话,并建立传输模式。
注解:此处确定了 RTP 传输交互式采用 TCP(面向连接)还是 UDP(无连接)模式。
4.4 关键字:PLAY
客户端发送播放请求。
注解:此处引入 RTP 协议及 RTCP 协议。
4.5关键字:PAUSE
播放暂停请求。
注解:此关键字经常用在录像回放当中,实时视频流几乎用不到。
4.6 关键字:TEARDOWN
客户端发送关闭请求
4.7 关键字:GET_PARAMETER
从服务器获取参数,目前主要获取时间参数(可扩展)
4.8 关键字:SET_PARAMETER
给指定的 URL 或者流设置参数(可扩展)
从流程图的第4步PLAY以下是RTSP对编码好的H.264的传输,采取分包发送的方法,这里的RTSP每包发送的最大是1400(nalu_sent_len)个字节,
首先要调用VENC_Sent的时候,要传参给它一个一帧的长度(nAvFrmLen),其中有个timestamp_increse,在同一帧的数据timestamp_increse是相同的,两帧的间隔算法:
timestamp_increse=(unsigned int)(90000.0 / 25)这里的90000.0是h.264的时钟频率,25是帧
率。这两帧的间隔是3600;
在一包数据头的部分有个rtp_hedr:有个marker是用来做标记的,在一帧中是分为多包发送的,只有最后一包marker=1,前面的其他包都是等于0;
4.9 RTSP状态码
Status-Code = “100” ; Continue
| “200” ; OK
| “201” ; Created
| “250” ; Low on Storage Space
| “300” ; Multiple Choices
| “301” ; Moved Permanently
| “302” ; Moved Temporarily
| “303” ; See Other
| “304” ; Not Modified
| “305” ; Use Proxy
| “400” ; Bad Request
| “401” ; Unauthorized
| “402” ; Payment Required
| “403” ; Forbidden
| “404” ; Not Found
| “405” ; Method Not Allowed
| “406” ; Not Acceptable
| “407” ; Proxy Authentication Required
| “408” ; Request Time-out
| “410” ; Gone
| “411” ; Length Required
| “412” ; Precondition Failed
| “413” ; Request Entity Too Large
| “414” ; Request-URI Too Large
| “415” ; Unsupported Media Type
| “451” ; Parameter Not Understood
| “452” ; Conference Not Found
| “453” ; Not Enough Bandwidth
| “454” ; Session Not Found
| “455” ; Method Not Valid in This State
| “456” ; Header Field Not Valid for Resource
| “457” ; Invalid Range
| “458” ; Parameter Is Read-Only
| “459” ; Aggregate operation not allowed
| “460” ; Only aggregate operation allowed
| “461” ; Unsupported transport
| “462” ; Destination unreachable
| “500” ; Internal Server Error
| “501” ; Not Implemented
| “502” ; Bad Gateway
| “503” ; Service Unavailable
| “504” ; Gateway Time-out
| “505” ; RTSP Version not supported
| “551” ; Option not supported
| extension-code
extension-code = 3DIGIT
Reason-Phrase = *<TEXT, excluding CR, LF