flv 格式分析

作者: mfdalf | 来源:发表于2020-11-06 22:47 被阅读0次

    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;

    image
    从编码器出来的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组成的.

    image
    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 实例分析:抓包分析
    1. amf 语法介绍
      Script Tag Data 采用amf语法存储数据(key:value方式).
      参见:实例讲解AMF格式:https://blog.csdn.net/weixin_42462202/article/details/88729491
    2. 抓包二进制分析
      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

    相关文章

      网友评论

        本文标题:flv 格式分析

        本文链接:https://www.haomeiwen.com/subject/etixbktx.html