flv文件格式


目录
  • 0. 前言
  • 1. FLV Header
  • 2. FLV File Body
    • 2.1 FLV tag 格式
    • 2.2 AUDIO DATA
      • 2.2.1 音频tag头
      • 2.2.2 AAC音频数据

0. 前言

FLV 是 flash video 的缩写,是 Adobe Flash payler 支持的一种流媒体播放格式。flv文件格式的官方文档 Adobe Flash Video File Format Specification Version 10.1 的附录E里。
flv文件格式由flv header和许多tag组成,一个flv文件只有一个flv header,tag 类型分为音频、视频、脚本,共三种类型,tag 由 tag 头和 tag 数据组成。

1. FLV Header

FLV header有 9 个字节,定义如下

字段 类型 描述
Signature UI8 总是'F', 0x46
Signature UI8 总是'L', 0x4C
Signature UI8 总是'V', 0x56
version UI8 文件版本号,总是1
保留字段 UB5 0
TypeFlagsAudio UB1 0-无音频;1-有音频
保留字段 UB1 0
TypeFlagsVideo UB1 0-无视频;1-有视频
DataOffset UI32 flv头的长度,version=1时,总是9

2. FLV File Body

flv 文件体由许多tag挨个存储组成,每个tag的前四个字节表示前一个tag的长度。

2.1 FLV tag 格式

tag 的格式如下

字段 类型 描述
Reserved UB2 保留字段,总是0
Filter UB1 表示包是否被处理过,如加密处理,0-未加密,1-加密
TagType UB5 tag类型,8 - audio,9 - video, 18 - script data
DataSize UI24 消息的长度。从StreamID到标签结束的字节数(等于tag的长度- 11)
Timestamp UI24 数据的时间戳,单位是ms
TimestampExtended UI8 扩展时间戳,这字节与前3字节组成SI32的时间戳,前三位是低24bit值
StreamID UI24 总是0
AudioTagHeader AudioTagHeader 如果TagType==8,接着就是音频tag头,AudioTagHeader定义在2.2.1小节
VideoTagHeader VideoTagHeader 如果TagType==9,接着就是视频tag头,VideoTagHeader定义在后面
EncryptionHeader EncryptionHeader 如果Filter==1,接着就是加密头,EncryptionHeader定义在后面
FilterParams FilterParams 如果Filter==1才有此字段
Data tag的数据,数据格式与TagType的类型有关,if TagType == 8,AUDIODATA; if TagType == 9,VIDEODATA;if TagType == 18,SCRIPTDATA

2.2 AUDIO DATA

音频数据由音频tag头和音频data构成。

2.2.1 音频tag头

音频tag头一个字节或者2个字节

字段 类型 描述
SoundFormat UB4 音频编码格式,定义入下:
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
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8 kHz
15 = Device-specific sound
7, 8, 14, 15是保留值
SoundRate UB2 采样率
0 = 5.5 kHz
1 = 11 kHz
2 = 22 kHz
3 = 44 kHz
SoundSize UB1 采样位数
0 = 8-bit
1 = 16-bit
SoundType UB1 声道模式
0 = 单声道
1 = 双声道(立体声)
AACPacketType UI8 AAC包类型,如果SoundFormat = 8 才会有这个字段
0 = AAC sequence header
1 = AAC raw

2.2.2 AAC音频数据

字段 类型 描述
data IF AACPacketType == 0
AudioSpecificConfig
ELSE IF AACPacketType == 1
Raw AAC frame data in UI8 []
AudioSpecificConfig定义在 ISO/IEC 14496-3 2009中。请注意,这与来自MP4/F4V文件的esds box的内容不同

ISO/IEC 14496-3 2009确实不好找,但是我还是找到了。https://csclub.uwaterloo.ca/~ehashman/ISO14496-3-2009.pdf