【音视频】H.264

封装格式 【【音视频】H.264】H.264的两种打包/封装方法:字节流AnnexB格式 AVCC格式
放用于网络发送时,要封装成RTP格式
1. AnnexB格式(实时播放)
开始前缀(00000001000001)+NALU数据,绝大部分编码器的默认输出格式

    1. 3字节0x000001单帧多slice(即单帧多个NALU)之间间隔
  1. 4字节0x00000001 帧之间,或者SPS等之前
2. AVCC(存储)
解码器配置参数在一开始就配置好了,系统可以很容易的识别NALU的边界,不需要额外的起始码,减少了资源的浪费,同时可以在播放时调到视频的中间位置。这种格式通常被用于可以被随机访问的多媒体数据,如存储在硬盘的文件。MP4、MKV通常用AVCC格式来存储。
AVCC格式不使用起始码作为NALU的分界,这种格式在每个NALU前都加上一个大端格式的前缀(1、2、4字节,代表NALU长度)
防字节竞争处理(Annxb和AVCC均有):RBSPEBSP
>用起始码定位NALU边界存在一个问题,即NALU中可能存在与起始码相同的数据。 >为了防止这个问题,在构建NALU时,需要在数据中的0x000000,0x000001,0x000002,0x000003中插入防竞争字节(Emulation Prevention Bytes)0x03,使其变为: 0x000000 = 0x0000 03 00 0x000001 = 0x0000 03 01 0x000002 = 0x0000 03 02 0x000003 = 0x0000 03 03 解码器在检测到0x000003时,将0x03抛弃,恢复原始数据。

3.RTP封装=12字节固定RTP包头 + 载荷(NALU)
rtp传输的是annexb的h264码流
0123 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X|CC|M|PT|sequence number| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |timestamp| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |synchronization source (SSRC) identifier| +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ |contributing source (CSRC) identifiers| |....| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+V:RTP协议的版本号,当前协议版本号为2。 P:填充标志,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。 X:扩展标志,如果X=1,则在RTP报头后跟有一个扩展报头 CC:CSRC计数器,指示CSRC 标识符的个数。M:标记位(不同载荷含义不同,视频标记一帧的最后一个分片slice则=1,其他=0) PT:载荷类型RTP_PAYLOAD_RTSP 如GSM音频、JPEM图像等。例如H264=96 序列号: 用于标识发送者所发送的 RTP 报文的序列号,每发送一个报文,序号增加 1时间戳:时间戳反映了该 RTP 报文的第一个八位组的采样时刻。 接受者使用时间戳来计算延迟和抖动, 并进行同步控制。SSRC:同步信源标识符 区分是在和谁通信。值随机选择,参加同一视频会议的两个同步信源的SSRC要相同。 //特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。

    推荐阅读