FlV = FLV Header + FLV Body
-
FLV Header
FLV Header = Signature(3 bytes) + Version(1 byte) + Type Flags(1 byte) + Data Offset(4 bytes)
-
Signature
3 字节,标识此文件,总为 FLV 0x46: 'F' 0x4c: 'L' 0x66: 'V'
-
Version
1 字节,标识版本号,总为 1 0x01: version 1
-
Type Flags
1 字节,标识此 FLV 是否含有音频、视频或者音视频 Flags = Type Flags Reserved(5 bits) + Type Flags Audio(1 bit) + Type Flags Reserved(1 bit) + Type Flags Video(1 bit)
-
Type Flags Reserved
5 bits,固定为 00000
-
Type Flags Audio
1 bit,标识是否含有音频 0: 不含有音频 FLV Tag 1: 含有音频 FLV Tag
-
Type Flags Reserved
1 bit,固定为 0
-
Type Flags Video
1 bit,标识是否含有视频 0: 不含有视频 FLV Tag 1: 含有视频 FLV Tag
-
Data Offset
4 字节,标识 FLV Header 的长度,flv1.0 版本总为 0x09 0x09(9): FLV Header 9 字节
-
FLV Body
FLV Body = Previous Tag Size(4 bytes) + FLV Tag + Previous Tag Size(4 bytes) + FLV Tag
-
Previous Tag
4 字节,标识前一个 FLV Tag 的长度(包括 Tag Header)。[0, 2^32] = [0, 4G]
-
FLV Tag
FLV Tag = Tag Header(11 bytes) + Tag Data
-
Tag Header
Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + TimestampEx(1 byte) + Stream ID(3 bytes)
-
Tag Type
1 字节,标识 Tag 类型。 0x08(8): audio 0x09(9): video 0x12(18): script data
-
Data Size
3 字节,标识 Tag Data 的长度。[0, 2^24] = [0, 16MB]
-
Timestamp
3 字节,标识 FLV Tag 的时间戳。[0, 2^24] = [0, 4.66hour]
-
TimestampEx
1 字节,扩展 FLV Tag 的时间戳到 4 字节。[0, 2^32] = [0, 49.71day]
-
Stream ID
3 字节,标识一个 stream,总是 0
-
Tag Data
不同类型的 Tag 的 Tag Data 结构,各不相同
-
详细介绍几种类型的 Tag
-
Script FLV Tag
该 Tag 类型又被称为 Metadata Tag,会放一些 FLV 视频和音频的元数据信息:duration、width、height 等。该 Tag 一般会在 flv header 的第一个 tag 出现,一般只出现一次。
Script FLV Tag = Tag Header(11 bytes) + Tag Data
-
Tag Header
Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + TimestampEx(1 byte) + Stream ID(3 bytes)
-
Tag Type
1 字节,固定 0x12 0x12(18): script
-
Data Size
3 字节,比如 0x 00 01 2c,十进制为 300
-
Timestamp
3 字节,固定 0x 00 00 00,默认为 0
-
TimestampEx
1 字节,固定 0x00,默认为 0
-
Stream ID
1 字节,固定 0x00,默认为 0
-
Tag Data
Tag Data = AMF Type(1 byte) + AMF Length(2 bytes) + AMF Value(10 bytes) + AMF Type(1 byte) + AMF Length(4 bytes) + AMF Value + Metadata
-
AMF-1 Type
1 字节,固定值 0x02
-
AMF-1 Length
2 字节,标识 onMetaData 字符串的长度。固定值 0x00 0a
-
AMF-1 Value
10 字节,一般默认值 0x6f 6e 4d 65 74 61 44 61 74 61
-
AMF-2 Type
1 字节,固定值 0x08
-
AMF-2 Length
4 字节,数组元素的个数
-
AMF-2 Value
计算得到字节,Tag Datasize - AMF-1(Type,Length,Value) - AMF-2(Type,Length) 300 - 13 - 5 = 283
-
Metadata
Metadata = duration + width + height + videodatarate + framerate + videocodecid + audiosamplerate + audiosamplesize + stereo + audiocodecid + filesize
-
Video FLV Tag
Video FLV Tag = Tag Header(11 bytes) + Tag Data
-
Tag Header
Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + TimestampEx(1 byte) + Stream ID(3 bytes)
-
Type
1 字节,固定 0x09,默认为视频 Tag 0x09(9): video
-
Data Size
3 字节,例如 0x 00 00 2c,表示这个 video tag 长度 44 字节
-
Timestamp
3 字节,0x 00 00 00, 因为是第一个 video tag
-
TimestampEx
1 字节,0x 00
-
Stream ID
3 字节,固定 0x 00 00 00
-
Tag Data
Tag Data = Frame Type(4 bits) + Codec ID(4 bits) + Video Data
-
Frame Type
4 bit 标识帧类型 0001(1): keyframe(for AVC, a seekable frame) 0010(2): inter frame(for AVC, a nonseekable frame) 0100(3): disposable inter frame(H.263 only) 1000(4): generated keyframe (reserved for server use only) 1001(5): video info/command frame
-
Codec ID
4 bit 标识 编码方案 0001(1): JPEG (currently unsed) 0010(2): Sorenson H.263 0100(3): Screen video 1000(4): On2 VP6 1001(5): On2 VP6 with alpha channel 1010(6): Screen video version 2 1011(7): AVC
-
AVC Packet
1 字节,标识 AVC Packet 类型 0x00: AVC 序列头 0x01: AVC NALU 单元 0x02: AVC 序列结束。低级别 AVC 不需要
-
CTS
3 字节,标识 CompositionTime 0x00: AVC Packet 类型是 0 0x01: AVC Packet 类型是 1,则为 CTS 偏移 cts = pts - dts/90
-
Data
1. AVC Packet 类型是 0,则是编码器配置,sps,pps. 2. AVC Packet 类型是 1,则是 NALU 单元 2.1 前 4 个字节是 NALU 长度 2.2 后面的数据就是真实的 NALU 数据了
-
Audio FLV Tag
Audio FLV Tag = Tag Header(11 bytes) + Tag Data
-
Tag Header
Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + TimestampEx(1 byte) + Stream ID(3 bytes)
-
Tag Type
1 字节,固定 0x08,标识音频
-
Data Size
3 字节,例如 0x 00 00 04,标识音频 tag data 长度 4 字节
-
Timestamp
3 字节,例如 0x 00 00 00,标识时间戳,第一个 audio tag 默认为 0
-
TimestampEx
1 字节,固定 0x00
-
Stream ID
1 字节,固定 0x00
-
Tag Data
Tag Data = Sound Format(4 bits) + Sound Rate (2 bits) + Sound Size(1 bit) + Sound Type(1 bit) + AAC Packet Type(1 byte) + Data
-
Sound Format
4 bits,标识音频编码格式 0000(0): Linear PCM, platform endian 0001(1): ADPCM 0010(2): MP3 0011(3): Linear PCM, little endian 0100(4): Nellymoser 16-kHz mono 0101(5): Nellymoser 8-kHz mono 0110(6): Nellymoser 0111(7): G.711 A-law logarithmic PCM, reserved for internal use 1000(8): G.711 mu-law logarithmic PCM, reserved for internal use 1001(9): reserved 1010(10): AAC(AAC is supported in Flash Player 9,0,115,0 and higher) 1011(11): Speex(Speex is supported in Flash Player 10 and higher) 1110(14): MP3 8Khz, reserved for internal use 1111(15): Device-specific sound, reserved for internal use
-
Sound Rate
2 bit,标识采样频率 00(0): 5.5-kHz 01(1): 11-kHz 10(2): 22-kHz 11(3): 44-kHz AAC 采样频率总是 44-kHz,注意这里是不支持 48-kHz 的
-
Sound Size
1 bit,标识采样位深度 0: 8bit samples 1: 16bit samples 这个参数只与未压缩格式有关。压缩格式在内部始终解码为16位
-
Sound Type
1 bit,标识声道数 0: 单通道 1: 双通道 AAC 总是双通道;Nellymoser 总是单声道
-
AAC Packet Type
1 byte,标识 AAC Packet 类型 0x00(0): 标识 AAC Sequence Header 0x01(1): 标识 AAC Raw Frame Data
-
AAC Sequence Header
AAC Sequence Header = AAC Profile(5 bits) + AAC Sample Frequence(4 bits) + AAC Channel Config(4 bits) + AAC Reserve(3 bits)
-
AAC Profile
5 bits,标识 AAC 的编码级别 00001: AAC Main 00010: AAC LC 00011: AAC SSR
-
AAC Sample Frequence
4 bits,标识 AAC Sample Frequence 采样率,一般为 0100 0000: 96000 0001: 88200 0010: 64000 0011: 48000 0100: 44100 0101: 32000 0110: 24000 0111: 22050 1000: 16000 1001: 12000 1010: 11025 1011: 8000 1100: reserved 1101: reserved 1110: reserved 1111: escape value
-
AAC Channel Config
4 bits,标识 通道数,一般为 0010 0000: 0001: 单声道 0010: 双声道 0011: 三声道 0100: 四声道 0101: 五声道 0110: 5.1 声道 0111: 7.1 声道 1000 - 1111: reserved
-
AAC Reserve
3 bits,标识保留位,一般为 0x 00 00 00
-
AAC Raw Stream
-
Optional
可选字段,只有是 AAC 音频有该字段