FLV format分析

作者: 噬魂Miss | 来源:发表于2019-01-07 11:10 被阅读40次

    hello大家好!我叫石头~
    今天我想跟大家掰扯掰扯FLV相关的技术,如果你们之前有看过相关的文章,应该对FLV HeaderFLV Body有所耳闻,先给2个图,混混眼熟,第一张是对flv format格式的抽象解读,第二章是对一个具体文件的格式解析。

    flv format streamAnalyzer4分析工具
    streamAnalyzer4分析工具链接
    接下来的文章里面我会以真实数据控制数据来区分人为添加的数据和音视频真正的数据。

    真实数据:就是用来真正记录我们视频显示,音频播放的数据。
    描述数据:就是用来告诉取数据(解析)的程序,这个文件里面的数据,你该怎么去处理。

    我们都知道,数据是以二进制(010111001...)的形式存在存储介质的,但是这些01数据表示什么东西呢,如果我们不加一些其他的信息的话,这些01数据我们就没办法去解析,所以flv格式的文件就是一些人为规定的描述信息实际的数据组成。
    到这里我们就知道flv是某些人或者某些组织共同约定的一种存数据,读数据的方式
    这里我想举个例子,严谨性不做过多讨论。
    flv文件 = flv header + flv body
    老外也很喜欢用header + body来也形象的描述他们想表达的事物,那我就用人来类比flv文件。我们人是在3维的空间,所以我们可以用3维(距离我多远,在房间的哪里,),或者二维(高度,宽度,肤色)的信息来刻画一个具体的人在空间的具体位置,但是如果我们要是把一个人压缩到一维的空间去存储(类似与存储视频数据,因为文件数据都是在一维空间上存储),等到时候还原到3维的时候我们该怎么还原呢,所以我们在一维的空间存一个人的肉的时候就要插入一些说明信息,比如:说明从哪里到哪里是表示手,哪里到哪里是表示手指,等等,所以我们在计算机中约定的一些协议,格式,等都是为了我们能在读真实的数据的时候能通过控制数据来还原真实数据原有的样子。如果不加这些描述数据,那么一个人从3维放到1维去存储,到时取出来的时候就是一坨肉泥了.
    顺便说一句:出现各种协议,数据格式,等等加了描述数据的数据都是由于我们的计算机体系结构决定的,目前计算机是以存储器为中心,所以在时间维度上,必定”取数据“不知道怎么还原数据。


    2.FLV Header(flv 头信息 9Byte)

    flv header就是人为加的描述数据,但是这个“头“应该设置多大呢,我们该表示什么信息呢,这些东西经过一堆人开n个会议,巴拉巴拉...讨论N久之后终于决定设置为9Byte

    flv format
    1-3:文件格式标识,必须为 46 4C 56【Signature】
    (46, 4c, 56是16进制,对应的ASCII为 46 = "F", 4c = "L", 56 = "V")
    4-4:版本,必须为 01【Version】
    5-5:媒体标识位(flags):上面的是0x05(0000 0101)下面的顺序都是从左到右
            1-5bit,必须为 0;【TypeFlagsReserved】
            6-6bit,音频标识;【TypeFlagsAudio】
            7-7bit,必须为 0;【TypeFlagsReserved】
            8-8bit,视频标识;【TypeFlagsVideo】
    6-9:FLV头长度,必须为 00 00 00 09【DataOffset】
    

    3.FLV Body

    FLV Body =( previousTagsize +Tag) * N,仔细看第一张图。
    Tag = Tag Header + Tag Data

    3.1 previousTagsize

    大小: 4字节
    表示前一个tag的大小

    3.2 Tag Header

    TAG类型:

    • 音频类型(0x08)
    • 视频类型(0x09)
    • 脚本类型(0x12)
    Tips:下面的顺序都是从左到右
    
    1-1:TAG类型 下面的顺序都是从左到右
            1-2bit,必须为 0;【Reserved】
            3-3bit,0 = 未加密,1 = 加密;【Filter】
            4-8bit,8 = 音频,9 = 视频,12(16进制) = 脚本数据;【TagType】
    2-4:数据大小,从 StreamID 到 Tag 结尾,也等于 TagLen -11【DataSize】
        数据区的大小,不包括包头。包头总大小是11个字节。
    5-7:时间戳,当前帧时戳,单位是毫秒。相对于FLV文件的第一个TAG时戳。第一个tag的时戳总是0。
        ——不是时戳增量,rtmp中是时戳增量。
    8-8:扩展时间戳,如果时戳大于0xFFFFFF,将会使用这个字节。这个字节是时戳的高8位,
        上面的三个字节是低24位。单位毫秒【TimestampExtended】
    9-11:流ID【StreamID】 总是0
    
    3.3 Tag Data
    3.3.1 Tag Data: video 类型
    video 类型 tag

    第1个字节的前4位的数值表示帧类型。
    第1个字节的后4位的数值表示。

    1-1:视频参数【VideoTagHeader】
            1-4bit,帧类型【FrameType】
                    1 = keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入帧。
                    2 = inter frame (for AVC, a non-seekable frame)——h264的普通帧
                    3 = disposable inter frame (H.263 only)
                    4 = generated key frame (reserved for server use only)
                    5 = video info/command frame
            5-8bit,编码类型【CodecID】
                    1 = JPEG (currently unused)
                    2 = Sorenson H.263
                    3 = Screen video
                    4 = On2 VP6
                    5 = On2 VP6 with alpha channel
                    6 = Screen video version 2
                    7 = AVC(H.264)
    [2-5]:H.264视频类型,注,只有在 CodecID=AVC 时,才有此数据
            AVCPacketType
           CompositionTime (ISO 14496-12, 8.15.3)
    
    3.3.2 Tag Data : Audio 类型
    audio 类型 tag
    1-1:音频头【AudioTagHeader】
            1-4bit,音频格式【SoundFormat】
                    0 = Linear PCM, platform endian
                    1 = ADPCM
                    2 = MP3
                    3 = Linear PCM, little endian
                    4 = Nellymoser 16 kHz mono
                    5 = Nellymoser 8 kHz mono
                    6 = Nellymoser
                    7 = G.711 A-law logarithmic PCM , reserved
                    8 = G.711 mu-law logarithmic PCM , reserved
                    9 = reserved
                    10 = AAC (supported in Flash Player 9,0,115,0 and higher)
                    11 = Speex (supported in Flash Player 10 and higher)
                    14 = MP3 8 kHz , reserved
                    15 = Device-specific sound , reserved
            5-6bit,采样率【SoundRate】
                    0 = 5.5kHz
                    1 = 11kHz
                    2 = 22kHz
                    3 = 44kHz
            7-7bit,位宽,0 = 8bit samples, 1= 16bit samples【SoundSize】
            8-8bit,通道,0 = Mono, 1 = Stereo【SoundType】
    [2-2]:AAC音频类型,注,只有在 SoundFormat=AAC 时,才有此数据
            0 = AAC sequence header
            1 = AAC raw
    

    TIPS:
    注:SoundFormat
    如果 SoundFormat=10 即AAC格式,官方建议使用44.1kHz采样率和双声道,即SoundType=1,SoundRate=3;Flash Player会忽略这两个参数,并从音频比特流中解析获得。
    如果 SoundFormat=11 即Speex格式,音频使用压缩的16kHz采样率的单声道,各参数取值为SoundRate=0,SoundSize=1,SoundType=0。

    3.3.3 Tag Data : Script 类型

    该类型Tag又通常被称为Metadata Tag,这个Tag存放关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个,并且不是必须的。

    一般来说,该Tag Data结构包含两个AMF包。
    AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,
    简单来说,AMF将不同类型的数据用统一的格式来描述。
    第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。
    第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。
    具体说明如下,大家可以参照图片上的数据进行理解
    
    image
       第1个字节表示AMF包类型,一般总是0x08,表示数组。
    
       第2-5个字节为UI32类型值,表示数组元素的个数。
    
       后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:
    
       第1-2个字节表示元素名称的长度,假设为L。
    
       后面跟着为长度为L的字符串。
    
       第L+3个字节表示元素值的类型。
    
       后面跟着为对应值,占用字节数取决于值的类型。
    

    例如:

    image image

    等等。。。
    后面准备分析下mp4格式,这篇文章就这样了,…………。

    相关文章

      网友评论

        本文标题:FLV format分析

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