🎬 FLV格式分析

核心定义:
FLV(Flash Video)是一种基于 Tag 的流媒体封装格式,由 FLV Header + PreviousTagSize + Tag Chain 组成。
每个 Tag 独立承载 Audio / Video / Script 数据。

📦 1. FLV Header(文件头,9 bytes)

字段 大小 类型 说明
Signature 3 bytes char[3] 固定 “FLV”
Version 1 byte uint8 通常为 0x01
Flags 1 byte bitfield 0x04(video) / 0x01(audio)
DataOffset 4 bytes uint32 Header长度(通常9)

🔗 2. PreviousTagSize(4 bytes)

字段 大小 说明
PreviousTagSize 4 bytes 前一个Tag的总长度(TagHeader + TagData)
👉 用于流式解析回溯,不依赖索引

🎞 3. FLV Tag结构(核心)

结构: Tag = TagHeader + TagData

字段 大小 类型 说明
TagType 1 byte uint8 8=audio / 9=video / 18=script
DataSize 3 bytes uint24 Tag Data长度
Timestamp 4 bytes uint32 低24位 + Extended 8bit
StreamID 3 bytes uint24 固定0

🎧 4. Audio Tag(音频数据结构)

⚠️ 当FLV数据中音频的类型是AAC时,前2个字节构成Audio Tag Header。

字段 位宽 说明
SoundFormat 4 bit AAC / MP3 / PCM
SoundRate 2 bit 5.5k / 11k / 22k / 44k
SoundSize 1 bit 8bit / 16bit
SoundType 1 bit mono / stereo
AAC 特殊:需要 AudioSpecificConfig(ASC)
The AudioSpecificConfig is explained in ISO 14496-3. AAC sequence header存放的是
AudioSpecificConfig结构,该结构则在“ISO-14496-3 Audio”中描述。
如果是AAC数据,如果他是AAC RAW, tag data[3] 开始才是真正的AAC frame data。

🎥 5. Video Tag(视频数据结构)

字段 位宽 说明
FrameType 4 bit keyframe / interframe
CodecID 4 bit H264 / H265 / VP6
AVCPacketType 8 bit 0=seq / 1=NALU / 2=end
CompositionTime 24 bit B帧时间偏移

1. CompositionTime 单位ms

CompositionTime 每个视频Tag (整个tag) 的第14-16个字节(如果Tag data偏移[3]~[5],[0],[1][2:AVCPackettype] (表示PTS相对于DTS的偏移值)。CompositionTime: 显示时间 = 解码时间(tag的第5~8字节,位置索引[4]~[7])+ CompositionTime

2. AVCDecoderConfigurationRecord

AVC sequence header就是AVCDecoderConfigurationRecord结构,该结构在标准⽂档“ISO-14496-15 AVC file format”

📜 6. Script Tag(元数据)

该Tag又成为MetaData Tag,存放一些关于FLV视频和音频的元信息,通常该Tag作为第一个Tag,并且只有一个,跟在FLV header后面。

  • key: onMetaData
  • duration
  • width / height
  • framerate
  • audiosamplerate
👉 用于播放器初始化(非常关键)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注