flv 格式分析

rtmp 分析参见:https://blog.****.net/fdsafwagdagadg6576/article/details/109462544

目录

1 h264 基础知识

2 FLV封装格式

1 h264 基础知识

H264流是由一个接一个nalu单元组成的。

1.1 h264 结构

原始的NALU单元组成:[start code] + [NALU header] + [NALU payload].

h264 NALU:  0x00 00 00 01 | nalu_type(1字节)| nalu_data (N 字节) | 0x00 00 00 01 | ...
               起始码(4字节)          类型                            数据              下一个NALU起始码
0x00 0x00 0x00 0x01 是nalu单元之间的分隔符.

nalu=nalu header+rbsp; rbsp=slice header+ slice data=flags+macroblock.

每个nalu是一帧.NALU header就是0x67(sps),0x65(i frame),......;NALU payload 是data.

第一个字节(8 bit)是type,几个常用Nalu_type如下:
0x67 SPS ;0x68 PPS;0x65 IDR帧;0x61 I帧;0x41 P帧;0x01 B帧;0x06  SEI;

flv 格式分析

从编码器出来的h264有start code,并且有pts,dts。

1.2  封装h264

每种格式根据自己的协议封装nalu.(没有了分隔符,如何区分不同nalu呢?当一个传输包中有多个nalu,肯定是增加nalu size字段区分不同的nalu).

(1) Rtp 封装h264,会去掉start code,分成3种情况封装,3种情况区分nalu的方法也是不同的.从原始的每个包start code+nalu,变成每个包rtp head+nalu(3种打包方式) 参见:RTP封装h264 https://www.cnblogs.com/likwo/p/3533396.html.

(2) Flv 封装h264,去掉start code, 加上nalu size,再加上video tag header 放入video tag中.从原始的每个包start code+nalu,变成每个tag:flv tag=flv tag header+nalusize+nalu

(3) Rtmp 封装h264,去掉start code,加上nalu size,再加上rtmp header

从原始的每个包start code+nalu,变成每个chunk,chunk=rtmpheader+flv tag

Notes: Rtmp和rtp 都涉及切包的问题。rtmp 切包:包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节。类似rtp切包的fu-a模式.

注意:原始h264,sps,pps是用分隔符分开的两个nalu,但是flv文件中SPS与PPS必须封装在一个Tag中.

Flv 格式将每个nalu包成tag.rtp 受限于每个包的长度,不能直接传裸h264.

2 FLV封装格式

flv文件是由一个头部信息,一个script Tag,然后是一个接一个的video Tag和audio Tag组成的.

flv 格式分析

 

2.1 Flv文件结构图

flv 格式分析

flv 格式分析

flv 格式分析

 

图2 有个错误,GeneralTagHeader是区分audio和video的. 它实际是videoTagHeader(09) or audioTagHeader(08).
VideoTagHeader 实际h264 header,是video的具体编码类型.

Notes: flv heade固定9个字节.

Video Tag=GeneralTagHeader+VideoTagHeader+VideoTagBody;

图1的tag Header=图2 的GeneralTagHeader ;

GeneralTagHeader固定11个字节(type,datasize,ts,ts_ex,stream id总是0).

图1 tagData=图2 av tagheader+av tagbody.

videoTagHeader is 固定5个字节,0x17 0x01 0x00 0x00 0x00.

audioTagheader is 固定2个字节 , 0xAF 0x01.

图1优点是写出个各个域的value,缺点是没有将tag data细分。

2.2 Flv header结构详细图

Header长度一般都是固定的9个字节:

flv 格式分析

 

2.3 Flv body 详细结构图

Flv Body由一个一个Tag组成,每个Tag都有一个preTagSize字段,标记着前面一个Tag的大小。

flv 格式分析

Tag有三种类型,Audio Tag(音频Tag),Video Tag(视频Tag),script Tag(又称Metadata Tag).

Tag=Tag Header+Tag Data.

对于不同类型的Tag,“Tag Header”的格式都是相同的,“Tag Data”的格式就不一样了。

Notes:注意flv header和flv tag header是不同的.

2.3.1 结构图

flv 格式分析

下面这张图归纳一下上面讲的内容,看完后对flv应该有个总体的了解了

flv 格式分析

2.3.2 tag data

Tag header是一样的,但是tag data是不一样的.

(1)Script tag data: type is 0x12.每个文件只有一个 onMetadata

flv 格式分析

(2)Video tag data: 就是一个字节0x17,然后是 01 00 00 00

H.264数据是AVCVIDEOPACKET格式.

如果AVCPacketType= 0,那么Data就是AVCDecoderConfigurationRecord格式.

以下是AVCDecoderConfigurationRecord的结构(sps,pps)

如果 AVCPacketType = 1,那么Data结构就简单多了

(非sps,pps. nalulen +nalu data)

(3) Audio tag data 一个字节0xAF 01

2.4 实例分析:抓包分析

1) amf 语法介绍

Script Tag Data 采用amf语法存储数据(key:value方式).

参见:实例讲解AMF格式:https://blog.****.net/weixin_42462202/article/details/88729491

1) 抓包二进制分析

flv 格式分析

开始9个字节是flv header;

0x12是script tag. tag header共11个字节,然后是tag data.

00 02 表示string,00 0A 是长度10,0x6F,0x6E,x4D,0x65,0x74,0x61,0x44,0x61

 is “onMetaData”(10个字节)。

00 08 是数组.接着00 08是 duration 长度.0x77开始是width.0x68开始是height.

Videodatarate...

二进制的详细分析请参考:将H.264封装为FLV格式:

https://blog.****.net/weixin_42462202/article/details/88665310

2) 不需要分析二进制,用wireshark工具会自动分析

https://www.cnblogs.com/jimodetiantang/p/8992425.html

参考引用:https://blog.****.net/weixin_42462202/article/details/88665310
https://blog.****.net/weixin_42462202/article/details/88661883