FLV 封装文件格式字段

17 阅读7分钟
FlV = FLV Header + FLV Body
  1. FLV Header

    FLV Header = Signature(3 bytes) + Version(1 byte) + Type Flags(1 byte) + 
                 Data Offset(4 bytes)
    
  2. Signature

    3 字节,标识此文件,总为 FLV
    0x46: 'F'
    0x4c: 'L'
    0x66: 'V'
    
  3. Version

    1 字节,标识版本号,总为 1
    0x01: version 1
    
  4. 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)
    
  5. Type Flags Reserved

    5 bits,固定为 00000
    
  6. Type Flags Audio

    1 bit,标识是否含有音频
    0: 不含有音频 FLV Tag
    1: 含有音频 FLV Tag
    
  7. Type Flags Reserved

    1 bit,固定为 0
    
  8. Type Flags Video

    1 bit,标识是否含有视频
    0: 不含有视频 FLV Tag
    1: 含有视频 FLV Tag
    
  9. Data Offset

    4 字节,标识 FLV Header 的长度,flv1.0 版本总为 0x09
    0x09(9): FLV Header 9 字节
    
  10. FLV Body

    FLV Body = Previous Tag Size(4 bytes) + FLV Tag + Previous Tag Size(4 bytes) + FLV Tag
    
  11. Previous Tag

    4 字节,标识前一个 FLV Tag 的长度(包括 Tag Header)。[0, 2^32] = [0, 4G]
    
  12. FLV Tag

    FLV Tag = Tag Header(11 bytes) + Tag Data
    
  13. Tag Header

    Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + 
                 TimestampEx(1 byte) + Stream ID(3 bytes)
    
  14. Tag Type

    1 字节,标识 Tag 类型。
    0x08(8): audio
    0x09(9): video
    0x12(18): script data
    
  15. Data Size

    3 字节,标识 Tag Data 的长度。[0, 2^24] = [0, 16MB]
    
  16. Timestamp

    3 字节,标识 FLV Tag 的时间戳。[0, 2^24] = [0, 4.66hour]
    
  17. TimestampEx

    1 字节,扩展 FLV Tag 的时间戳到 4 字节。[0, 2^32] = [0, 49.71day]
    
  18. Stream ID

    3 字节,标识一个 stream,总是 0
    
  19. Tag Data

    不同类型的 Tag 的 Tag Data 结构,各不相同
    
  20. 详细介绍几种类型的 Tag

  21. Script FLV Tag
    该 Tag 类型又被称为 Metadata Tag,会放一些 FLV 视频和音频的元数据信息:duration、width、height 等。该 Tag 一般会在 flv header 的第一个 tag 出现,一般只出现一次。

    Script FLV Tag = Tag Header(11 bytes) + Tag Data
    
  22. Tag Header

    Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + 
                 TimestampEx(1 byte) + Stream ID(3 bytes) 
    
  23. Tag Type

    1 字节,固定 0x12
    0x12(18): script
    
  24. Data Size

    3 字节,比如 0x 00 01 2c,十进制为 300
    
  25. Timestamp

    3 字节,固定 0x 00 00 00,默认为 0
    
  26. TimestampEx

    1 字节,固定 0x00,默认为 0
    
  27. Stream ID

    1 字节,固定 0x00,默认为 0
    
  28. 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
    
  29. AMF-1 Type

    1 字节,固定值 0x02
    
  30. AMF-1 Length

    2 字节,标识 onMetaData 字符串的长度。固定值 0x00 0a
    
  31. AMF-1 Value

    10 字节,一般默认值 0x6f 6e 4d 65 74 61 44 61 74 61
    
  32. AMF-2 Type

    1 字节,固定值 0x08
    
  33. AMF-2 Length

    4 字节,数组元素的个数
    
  34. AMF-2 Value

    计算得到字节,Tag Datasize - AMF-1(Type,Length,Value) - AMF-2(Type,Length)
    300 - 13 - 5 = 283 
    
  35. Metadata

    Metadata = duration + width + height + videodatarate + framerate +
         videocodecid + audiosamplerate + audiosamplesize + stereo +
         audiocodecid + filesize
    
  36. Video FLV Tag

    Video FLV Tag = Tag Header(11 bytes) + Tag Data
    
  37. Tag Header

    Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) + 
                 TimestampEx(1 byte) + Stream ID(3 bytes)
    
  38. Type

    1 字节,固定 0x09,默认为视频 Tag
    0x09(9): video
    
  39. Data Size

    3 字节,例如 0x 00 00 2c,表示这个 video tag 长度 44 字节
    
  40. Timestamp

    3 字节,0x 00 00 00, 因为是第一个 video tag
    
  41. TimestampEx

    1 字节,0x 00
    
  42. Stream ID

    3 字节,固定 0x 00 00 00
    
  43. Tag Data

    Tag Data = Frame Type(4 bits) + Codec ID(4 bits) + 
               Video Data
    
  44. 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
    
  45. 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
    
  46. AVC Packet

    1 字节,标识 AVC Packet 类型
    0x00: AVC 序列头
    0x01: AVC NALU 单元
    0x02: AVC 序列结束。低级别 AVC 不需要
    
  47. CTS

    3 字节,标识 CompositionTime
    0x00: AVC Packet 类型是 0
    0x01: AVC Packet 类型是 1,则为 CTS 偏移
    
    cts = pts - dts/90
    
  48. Data

    1. AVC Packet 类型是 0,则是编码器配置,sps,pps.
    2. AVC Packet 类型是 1,则是 NALU 单元
       2.1 前 4 个字节是 NALU 长度
       2.2 后面的数据就是真实的 NALU 数据了
    
  49. Audio FLV Tag

    Audio FLV Tag = Tag Header(11 bytes) + Tag Data
    
  50. Tag Header

    Tag Header = Tag Type(1 byte) + Data Size(3 bytes) + Timestamp(3 bytes) +
                 TimestampEx(1 byte) + Stream ID(3 bytes)
    
  51. Tag Type

    1 字节,固定 0x08,标识音频
    
  52. Data Size

    3 字节,例如 0x 00 00 04,标识音频 tag data 长度 4 字节
    
  53. Timestamp

    3 字节,例如 0x 00 00 00,标识时间戳,第一个 audio tag 默认为 0
    
  54. TimestampEx

    1 字节,固定 0x00
    
  55. Stream ID

    1 字节,固定 0x00
    
  56. 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
    
  57. 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
    
  58. 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 的
    
  59. Sound Size

    1 bit,标识采样位深度
    0: 8bit samples
    1: 16bit samples
    这个参数只与未压缩格式有关。压缩格式在内部始终解码为16位
    
  60. Sound Type

    1 bit,标识声道数
    0: 单通道
    1: 双通道
    AAC 总是双通道;Nellymoser 总是单声道
    
  61. AAC Packet Type

    1 byte,标识 AAC Packet 类型
    0x00(0): 标识 AAC Sequence Header
    0x01(1): 标识 AAC Raw Frame Data
    
  62. AAC Sequence Header

    AAC Sequence Header = AAC Profile(5 bits) + 
                          AAC Sample Frequence(4 bits) +
                          AAC Channel Config(4 bits) +
                          AAC Reserve(3 bits) 
    
  63. AAC Profile

    5 bits,标识 AAC 的编码级别
    00001: AAC Main
    00010: AAC LC
    00011: AAC SSR
    
  64. 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
    
  65. AAC Channel Config

    4 bits,标识 通道数,一般为 0010
    0000:
    0001: 单声道
    0010: 双声道
    0011: 三声道
    0100: 四声道
    0101: 五声道
    0110: 5.1 声道
    0111: 7.1 声道
    1000 - 1111: reserved
    
  66. AAC Reserve

    3 bits,标识保留位,一般为 0x 00 00 00
    
  67. AAC Raw Stream

  68. Optional

    可选字段,只有是 AAC 音频有该字段