2020-08-19
记录下在接收flv数据时需要提取出h264数据遇到的坑,来记录下:
在下图1-1是抓取h264数据包,其中可以看到在视频数据类型(0x09)后紧接就是0x27 0x01 .....了,0x27 0x01表示的是P帧数据,正正因为如果单单只看这个抓包软件反应的情况直接0x09紧接着就是0x27 0x01的话,就会给我们后续拉流解码带来隐患,为啥这么说,接下来就会明白了哈!
图1-1 rtmp抓包的数据
如下图1-2是真实拉流中将获取到的flv(带有h264的数据)保存下来的情况,可以看到在数据类型0x09后还有11个字节的数据才会出现上述接下来的0x27 0x01....的P帧真实裸流数据,为何0x09之后还会有如此多的字节呢,下面也会讲到哈!
图1-2 实际接收到的数据情况
如图1-3所示为flv数据的存储结构,这个表其实很容易误导新人的,为何这么说?因为这里的Flv Header是指flv文件头,如果是仅仅关心裸的flv数据的话可以不用关心它。更为重要的是后面这个“Flv Body”数据,在这个数据结构中有一个Tag Header就是上面我们看到的包括0x09 之后的11个字节的数据头,在这个头之后才是我们真正想要的音视频数据(h264、aac等),如下为Flv Body的结构:
Flv数据头+音视频裸流数据头+音视频真实数据;
以h264举例:flv数据头(0x09之后一共11个字节) + 0x27/0x17之后的数据头 + h264数据
看到这里希望能以后有遇到这个坑的能少花时间就能绕过去!
图1-3flv中的数据结构(h264和aac等)