FLV协议

FLV格式

FLV格式为heder+body

FLV文件中数据存储方式为大端(big-endian)模式

时间戳单位为毫秒

字段 类型 描述
标记 UI8 ‘F’(0x46)
标记 UI8 ‘L’(0x4c)
标记 UI8 ‘V’(0x56)
版本 UI8 flv版本
保留 UB[5] 0
Audio UB[1] 1代表有audio tag
保留 UB[1] 0
Video UB[1] 1代表有video tag
DataOffset UI32 0x09

Body

字段 类型 描述
PreviousTagSize0 UI32 0,第一个PreviousTagSize
Tag1 FLVTAG 第一个tag
PreviousTagSize1 UI32 前一个tag的大小,包括它的头部,单位字节。在第一版FLV中,它的大小是11+前一个tag大小
Tag2 FLVTAG 第二个Tag
···    
PreviousTagSizeN-1 UI32 倒数第二个tag的大小
TagN FLVTAG 最后一个Tag,包括头部
PreviousTagSizeN UI32 最后一个tag的大小,包括头部

FLV Tag 定义

FLV Tag

FLV tag包括audio、video的metadata或者sctipts,可选的加密metadata,以及数据负载(payload)

字段 类型 描述
保留 UB[2] 保留给FMS,0
过滤 UB[1] 表示数据是否已过滤,0 = 不需要预先处理,1 = 在渲染之前需要预处理(如解密),在未加密文件中应该为0,加密过的Tag需要置该位为1。
Tag类型 UB[5] 该Tag内容类型,8 = 音频,9 = 视频,18 = 脚本。
数据大小 UI24 消息的长度,StreamId到tag末尾的长度(相当于tag长度-11)
时间戳 UI24 DTS,解码时间
时间戳扩展 UI8  
流ID UI24 0
Tag头 Tag类型为8时表示音频Tag头,为9时表示视频Tag头  
加密头 过滤为1时  
过滤参数 过滤为1时  
数据 Tag类型为8时是音频数据,为9时是视频数据,为18时表示脚本数据  

音频Tag

音频头

字段 类型 描述
音频格式 UB[4] 音频格式,具体格式见FLV文档
音频采样率 UB[2] 0 = 5.5kHz, 1 = 11kHz, 2 = 22kHz, 3 = 44kHz
音频位宽 UB[1] 每个音频采样的位宽,属于未压缩的音频格式,压缩过的格式内部解码为16位。0 = 8位,1 = 16位。
音频类型 UB[1] 0 = 单声道,1 = 立体声
AAC包类型 当音频类型 = 10,UI8 0 = AAC序列头,1 = AAC裸数据

音频数据

字段 类型 描述
音频数据 当音频类型 = 10为AAC音频数据  

AAC音频数据

字段 类型 描述
数据 AAC包类型 = 0时为音频定义配置,= 1时为UI8[]类型的AAC帧裸数据  

视频tag

视频头

字段 类型 数据
帧类型 UB[4] 1 = 关键帧,2 = 参考帧
编码ID UB[4] 7 = AVC,其他省略
AVC包类型 当编码ID = 7,UI8 0 = AVC序列头,1 = NALU,2 = AVC序列末尾
相对时间戳 如果编码ID = 7,SI24 CTS,如果AVC包类型 = 1存放相对时间,否则为0

PTS = DTS + CTS

视频数据

字段 类型 描述
视频tag body 根据帧类型定义  

AVC视频包

字段 类型 数据
数据 如果AVC包类型 = 0表示AVC解码配置记录,= 1表示1个或多个NALU  

一般第一个音频tag和第一个视频tag是解码配置记录,记录解码所需的参数,比如h264中的SPS、PPS,aac中的ADTS header。

脚本数据

见官方文档