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格式就分析完成。
总结图例:
