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