FLV format分析

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格式,这篇文章就这样了,…………。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容