FLV格式学习分析总结

2023.2.1


FLV文件由文件头(Flv Header) 和文件体(Flv Body)组成。



Flv Header——共占 9 个Bytes


第1Bytes是文件标识符 “F” 用十六进制 0x46 表示。

第2Bytes是文件标识符 “L” 用十六进制 0x4C 表示。

第3Bytes是文件标识符 “V” 用十六进制 0x56 表示。

第4Bytes是文件版本号,0x01表示FLV版本1。

第5Bytes分为四个部分,第一部分占5bit,是保留位,必须为0。

                                            第二部分占1bit,表示是否存在音频,1表示存在。

                                            第三部分占1bit,是保留位,必须为0。

                                            第四部分占1bit,表示是否存在视频,1表示存在。

最后4Bytes记录了Flv Header从第1Bytes到Flv Body之前的字节数,包括自己所占的4Bytes。


Flv Body——是由一个个Tag组成,Tag分为 Video Tag 和 Audio Tag 两种,每一个Tag里面都有一个TagSize,标记着前一个Tag的大小


先讲 Video Tag,它分为两种情况:

第一种是 SPS Video Tag(视频流的第一个Video Tag)


SPS Video Tag 由 Tag Header 和 Tag Data组成。

Tag Header 占用 11 个Bytes:

第1Bytes是Tag的类型,音频为 0x08,视频为 0x09,script data为 0x12。

接下来3Bytes表示Tag数据的大小。

接下来3Bytes表示该Tag的时间戳。

第8Bytes是时间戳的扩展位,当3个Bytes不够用的时候,这个字节为最高字节,将时间戳扩展位4个字节。

最后3Bytes总是为0。

这里的Tag Data还分为:

1.Data Header(一共5个Bytes):

第1Bytes是 Frame Type & CodecID,其中前4bit Frame Type 取 1 为关键帧(一共5种取值,见图),后4bit CodecID 取 7 AVC,代表 H264(一共7种取值,见图)。

第2Bytes是 AVCPacketType,取0,用0x00表示视频第一帧(一共3种取值,见图)。

接下来是固定3个Bytes大小,总是为0。

2.SPS Info(一共8个Bytes):

第1Bytes是 configurationversion(配置版本),固定为0x01。

第2Bytes是 avcprofileindication (描述指示),第二个位置[1]。

第3Bytes是 profilecompatibilty (描述能力),第三个位置[2]。

第4Bytes是 avclevelindication (等级指示),第四个位置[3]。

第5bytes是 reserved + lengthsizeminusone 默认0xff,分别先后各占4bit。

第6Bytes是 reserved + numofsequenceset 默认0xe1,分别先后各占4bit。

最后2Bytes表示SPS的长度,第1Bytes是高8位,第2Bytes是低8位。

3.SPS Data,这里是真实的SPS数据,有多少放多少

4.PPS Info(一共3个Bytes):

第1Bytes是 numofpictureset PPS的个数。

后2个Bytes表示PPS的长度,第1Bytes是高8位,第2Bytes是低8位。

5.PPS Data,这里是真实的PPS数据,有多少放多少

这里是TagSize,固定4Bytes大小,用来记录它(TagSize)前面的Tag(这里指SPS Video Tag)的大小


第二种是普通的Video Tag


普通 Video Tag 也由 Tag Header 和 Tag Data 组成

Tag Header 占用 11 个Bytes,和上面一样。

普通的Tag Data还分为:

1.Data Header(一共5个Bytes):

第1Bytes是 Frame Type & CodecID,其中前4bit Frame Type 取 2 为非关键帧(一共5种取值,这里与SPS Video Tag Header 不一样),后4bit CodecID 取 7 AVC,代表 H264(一共7种取值,见图)。

第2Bytes是 AVCPacketType,取0,用0x00表示视频第一帧(一共3种取值,见图)。

接下来是固定3个Bytes大小,总是为0。

2.Video Data :

开始4Bytes用来记录真实画面数据的大小 

接下来就是真实数据,有多少放多少

这里是TagSize,固定4Bytes大小,用来记录它前面的Tag的大小


至此,FLV格式视频部分分析就完成了,接下来是音频部分


Audio  Tag 部分:


Audio Tag 也由 Tag Header 与 Tag Data 组成

这里的 Tag Header 与 Video Tag Header 一样 占用 11 个Bytes:

第1Bytes是Tag的类型,音频为 0x08,视频为 0x09,script data为 0x12。

接下来3Bytes表示Tag数据的大小。

接下来3Bytes表示该Tag的时间戳。

第8Bytes是时间戳的扩展位,当3个Bytes不够用的时候,这个字节为最高字节,将时间戳扩展位4个字节。

最后3Bytes总是为0。

Audio Tag Data同样也分为:

1.Data Header(共1个Bytes)

前4bit 是SoundFormat(音频编码格式),一共14个取值(详见图)。

接下来2bit是SoundRate(音频频率),有4个取值(详见图)。

第7bit是SoundSize(音频采样位宽),分别取值0(snd8bit)和1(snd16bit)。

第8bit是SoundType(音频声道),分别取值0(sndMono 单声道)和1(sndStereo 双声道)。

2.Audio Data:这里举例为常用的AAC与MP3格式

①AAC格式的Audio Data:

开始的第1个Bytes,固定为0,标志着接下来有一个AAC的头部数据。

接下来7个Bytes,是AAC的真实头部数据。

接下来1个Bytes,标志着接下来是真实的AAC音频数据。

经过前面9个Bytes,这里是真实的AAC音频数据,有多少放多少。

②MP3格式的Audio Data:

这里直接就存放真实的MP3音频数据。

最后,这个位置是固定4个Bytes大小的TagSize,记录前面Tag的大小。


至此,整个FLV格式就分析完成。


总结图例:



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。 ...
    zjjcc阅读 3,223评论 1 3
  • 在如何看待哔哩哔哩的开源 HTML5 播放器内核 flv.js?中,flv.js作者有这样一段回复:一些人问我为什...
    合肥黑阅读 2,585评论 1 4
  • Rtmp 分析参见:https://blog.csdn.net/fdsafwagdagadg6576/articl...
    mfdalf阅读 1,906评论 0 0
  • 简介 FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其...
    轻口味阅读 1,209评论 0 0
  • FLV 文件 = File Header(FLV 文件头)+ File Body(FLV 文件体)。其中文件体又由...
    Coder_Sven阅读 2,493评论 1 1

友情链接更多精彩内容