rtmp 分析参见:https://blog.csdn.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;
从编码器出来的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组成的.
2.1 Flv文件结构图
image
image
image
图2 有个错误,GeneralTagHeader是区分audio和video的. 它实际是videoTagHeader(09) 或者 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个字节:
image
2.3 Flv body 详细结构图
Flv Body由一个一个Tag组成,每个Tag都有一个preTagSize字段,标记着前面一个Tag的大小。
image
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 结构图
image
下面这张图归纳一下上面讲的内容,看完后对flv应该有个总体的了解了
image
2.3.2 tag data
Tag header是一样的,但是tag data是不一样的.
(1)Script tag data: type is 0x12.每个文件只有一个 onMetadata
image
(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 实例分析:抓包分析
- amf 语法介绍
Script Tag Data 采用amf语法存储数据(key:value方式).
参见:实例讲解AMF格式:https://blog.csdn.net/weixin_42462202/article/details/88729491 - 抓包二进制分析
image
开始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.csdn.net/weixin_42462202/article/details/88665310
2) 不需要分析二进制,用wireshark工具会自动分析
<u><u>https://www.cnblogs.com/jimodetiantang/p/8992425.html</u></u>
参考引用:https://blog.csdn.net/weixin_42462202/article/details/88665310
https://blog.csdn.net/weixin_42462202/article/details/88661883
网友评论