H264 over RTP学习总结

                        

  1. 每个RTP包,由RTP头标准字段(固定12字节)、RTP头扩展字段、RTP负载、填充字段组成,
  2. VRTP协议的版本号,占2位,当前协议版本号为2
  3. P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。如果P=1,需要查看这一个RTP包文最后一个字节(该字节的值只可能为123),如果字节值是0x01,说明只有一个字节填充;如果是0x02, 说明有两个字节填充;如果字节值是0x03,说明有三个字节填充
  4. X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。
  5. CCCSRC计数器,占4位,指示CSRC 标识符的个数
  6. M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始;RTP数据包有大小限制,完整的一帧数据,可能需要多个RTP包传输,如果是视频帧,最后一包的Mark位需要设置为1,同一帧数据内的多个包,时间戳是相同的。
  7. PT: 有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型
  8. 时戳(Timestamp):占32位,时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位。时间戳增量:相邻两个RTP包之间的时间差(以时间戳单位为基准)。 // 两帧之间的时间差 * 90次采样/毫秒
  9. 同步信源(SSRC)标识符:占32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC

首先,将0x80 0x60拆成二进制:1000 0000  0110 0000,第一个字节前两位是10,也就是版本号是2,这个是当前标准规定的;其余位都是0。然而平时填充位是有可能存在的,所以第一个字节为1010 0000,也就是A0

  第二个字节第一位是mark位,如果是视频帧的首帧,那么mark位就是1,也就是E0

       H264和NAL

i i frame,即内部画面 intra picture,通常是GOP的第一个帧(IDR)

P帧,前向搜索帧/前向预测帧,以I帧预测P

B帧,双向搜索帧/双向内插帧,由I帧、P帧预测B

一个序列的第一个图像叫做IDR图像(即立即刷新图像),IDR图像都是I帧图像。当解码器解到IDR图像时,立即将参考帧队列清空,将已经解码的数据全部输出或抛弃,重新查找参数集,开始一个新的队列。这样,如果前一个序列出现重大问题,在这里可以获得重新同步的机会。IDR之后的图像永远不会使用IDR之前的图像的数据来解码。

所有视频至少包含一个I帧,且作为文件的第一个帧,文件里的其他的I帧用来改善视频质量,但增加了文件大小
一般而言,每秒视频至少需要1个I帧,每秒里增加I帧可以改善质量,但增加网络带宽和网络负载
视频播放过程中,若I帧丢失,则随后的P帧也就无法解析,所以出现黑屏现象,若P帧丢失,则出现花屏、马赛克现象

           H264和NAL

H264从结构上分为 视频编码层VCL(video coding layer)和网路抽象层NAL(network abstract layer)NALVCL的输出封装成NALU(网络抽象层单元),以适应基于包的网络传输或面向包的多路复用环境。

NALU   =  00 00 00 01 +  FU-indicator  +  VCL

h264数据帧的NALU前面带有 00 00 00 01 00 00 01 分隔符,一般VCL输出首帧数据为PPSSPS,接着是IDR

00 00 00 01 67 SPS 00 00 00 01 68 PPS 00 00 00 01 65 IDR ... ...

分隔符作为NALU的开始边界和结束边界,解码器使用分隔符逐个字节匹配数据流,计算NALU的长度,然后开始解码

|0 |1 |2 |3 |4 |5 |6 |7 |

|F |NRI|Type              |

F:       1 bit  forbidden_zero_bit H.264规范声明值设置为1表示语法违例

NRI:   2 bit  nal_ref_idc 表示NALU的优先级。0--3,取值越大,该NALU越重要,需要优先保护

00值表示该NALU不用于帧间图像预测重构参考图像,可以丢弃不用冒参考图像完整性风险。如果NALU是参考帧slicePPSSPS时,该值必须大于0

Type: 5 bit  nal_unit_type 表示NALU载荷类型,类型值定义如下

0:未定义

1:非IDR图像不采用数据划分片段

2:非IDR图像采用数据划分片段A部分

3:非IDR图像采用数据划分片段B部分

4:非IDR图像采用数据划分片段C部分

5:IDR图像片段

6:辅助增强信息 (SEI) 

7:序列参数集(SPS)

8:图像参数集(PPS)

通过RTP协议传输H264视频

RTCP控制协议需要与RTP数据协议一起配合使用,当应用程序启动一个RTP会话时将同时占用两个端口,分别供RTPRTCP使用。RTP本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完成。通常RTCP会采用与RTP相同的分发机制,向会话中的所有成员周期性地发送控制信息。

1. 单一NAL单元模式

    即一个RTP数据报中仅包含一个完整的NALU,这种情况下PRT NAL头type字段和原始的H.264的NALU头类型字段是一样的。

2. 组合封包模式

    即可能由多个NAL单元组成一个RTP包,分别有4种组合模式:STAP-A,STAP-B,MTAP16,MTAP24,对应的type值分别为24,25,26以及27。

3. 分片封包模式

    用于把一个NALU单元封装成多个RTP包,存在两种类型FU-A和FU-B,对应的type值分别为28和29。

由于UDP数据报长度超过1500字节时,会自动拆分发送,增大了丢包概率,那么去除UDP数据报头以及RTP的Header部分,这里设置Payload部分最大长度为1400字节即可,当NALU单元长度大于1400字节时,就用分片封包模式。

当一个NALU单元长度较长时,采用分片封包模式,也称为Fragmentation Units (FUs)

RTP =  RTP-HEAD + FU indicator + FU header + payload

RTP-HEAD   +      FU-indicator       +        FU-HEAD

p v x cc | m pt | seq timestamp ssrc    F  NRI  | Type   S  E  R(0)|   TYPE

         1   |    1    | 2     4                   4        0  3      | 28       1  0  0      |0  0001

                                                                           7C                      81

                                                                           7C                      01

                                                                           7C                      41 

       

参考:https://blog.csdn.net/xiaolei251990/article/details/82787911

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值