rtmp 协议中对视频格式的封装

前面有一篇文章 http://blog.csdn.net/ddr77/article/details/52680120

分析了对音频的封装。最近做项目,发现需要对视频做一些比较深的理解。


这段数据代表了什么?

04 表示0类型的chunk ,04表示音频或者视频数据。具体看下面

000000 三个自己的时间戳

00002f 数据长度,表示后面的msg长度,不包括这个头。

09 表示是视频数据。

01000000 表示流id,小段表示

17 换成二进制位 00010111

0001 表示关键帧。

其他值位

0010 p帧

其他都不用

0111 表示是avc编码器。

rtmp 对于h264有自己的封装格式表示,具体为


在这个包里面,第一个字节为0 ,后三个字节也是0 ,那么这四个表示后面的数据上一个配置

具体如下

rtmp 协议中对视频格式的封装_第1张图片

一共是7个字节,跳过这其他字节,就是真正264s数据。


具体分析

根据 AVCDecoderConfigurationRecord 结构的定义:

  • configurationVersion = 01
  • AVCProfileIndication = 4D
  • profile_compatibility = 40
  • AVCLevelIndication = 29
  • lengthSizeMinusOne = FF <- 非常重要,是 H.264 视频中 NALU 的长度,计算方法是 1 + (lengthSizeMinusOne & 3),实际计算结果一直是4
  • numOfSequenceParameterSets = E1 <- SPS 的个数,计算方法是 numOfSequenceParameterSets & 0x1F,实际计算结果一直为1
  • sequenceParameterSetLength = 00 1b <- SPS 的长度 27个字节
  • sequenceParameterSetNALUnits = 67 4D 40 29 ec a0 50 1e d3 50 10 d0 63 00 00 03 00 04 00 00 03 00 7a 3c 60 c6 58 <- SPS
  • numOfPictureParameterSets = 01 <- PPS 的个数,一直为1
  • pictureParameterSetLength = 00 04 <- PPS 的长度
  • pictureParameterSetNALUnits = 68 Ef bc 80 <- PPS
推荐一篇文章  点击打开链接

下面分析264的sps  pps 

67  == 011 00111 

011 基本不管,

00111=7 表示sps 的意思

其他含义如下

#define NALU_TYPE_SLICE    1
#define NALU_TYPE_DPA      2
#define NALU_TYPE_DPB      3
#define NALU_TYPE_DPC      4
#define NALU_TYPE_IDR      5
#define NALU_TYPE_SEI      6
#define NALU_TYPE_SPS      7
#define NALU_TYPE_PPS      8
#define NALU_TYPE_AUD      9
#define NALU_TYPE_EOSEQ    10
#define NALU_TYPE_EOSTREAM 11
#define NALU_TYPE_FILL     12

接下来表示如下

profile_idc = 4d
constraint_set0_flag
constraint_set1_flag
constraint_set2_flag
constraint_set3_flag
constraint_set4_flag
constraint_set5_flag
reserved_zero_2bits =40
level_idc = 29

都是解码器的配置,但一般我们主要关心的是活的长度和高度,那么在哪里呢?

前三个字节的意思如上,从第四个字节开始分析

具体分析看连接吧,好复杂

点击打开链接

对于普通的视频包的分析,也就是是说avpackettype= 1的情况的分析情况如下

点击打开链接


rtmp 协议中对视频格式的封装_第2张图片


和非关键帧数据

rtmp 协议中对视频格式的封装_第3张图片

呢?

你可能感兴趣的:(rtmp 协议中对视频格式的封装)