Post

FLV

FLV (Flash Video)

FLV는 Flash Player 6부터 지원되는 포맷으로, Flash Player Server/Client에서 audio와 video를 다루기 위한 포맷이다. FLV 컨테이너의 추상화는 RTMP와 매우 닮아있다. FLV의 데이터는 big-endian으로 다뤄진다. FLV 컨테이너는 FLV header와 FLV body로 구성되어 있으며, FLV의 tag (track)는 최대 오디오 1개와 비디오 1개로 구성될 수 있다. FLV header Fig. 0과 같다.

FLV Header Fig. 0: FLV header [0]

  • “FLV” Char로 시작
  • Version (8): 2010.09.03 spec 기준으로 현재 version은 1
  • TypeFlagsReserved (5): Reserved bit, 0
  • TypeFlagsAudio (1): Audio tag의 존재 여부, 존재하면 1
  • TypeFlagsReserved (1): Reserved bit, 0
  • TypeFlagsVideo (1): Video tag의 존재 여부, 존재하면 1
  • DataOffset (32): File의 시작으로부터 body 까지의 byte (Header의 크기).

FLV Body

FLV의 body는 Fig. 1과 같이 4byte 크기의 이전 tag의 크와 tag 가 interleaving 되어있다. 가장 앞의 tag size는 0으로 채워진다.

FLV Body Fig. 1: FLV body [0]

각각의 FLV tag는 tag header와 tag data로 구성되어있다.

FLV Tag Fig. 2: FLV tag [0]

  • TagType (8): Tag의 종류. Audio=8, Video=9, Script data= 18
  • DataSize (24): Tag data의 크기
  • Timestamp (24): timestamp (u_int24)
  • TimestampExtended (8): timestamp의 확장. 확장 시 timestamp는 int32로 표기되며, 그 중 TimestampExtended 는 upper bit를 표기
  • StreamID (24): 0
  • Data: Tag data

Audio Tag

Audio tag는 Fig. 3와 같이 audio header와 data부분으로 또 한번 나뉜다. 그리고 AAC(Advanced Audio Coding)로 압축된 데이터를 담고있는 경우에는 Fig.4 와 같이 SoundData의 앞에 1 byte 크기의 AAC header가 존재한다.약 1 byte 크기의 data에 정보를 압축하는 대신 다양한 포맷을 지원하지 못한다.

Audio Tag Fig. 3: FLV sound(audio) tag [0]

  • SoundFormat (4): PCM/Codec
  • SoundRate (2): 5.5 kHz, 11 kHz, 22 kHz, 44 kHz
  • SoundSize (1): 압축되지 않은 데이터의 sample format
  • SoundType (1): Mono/Stereo
  • SoundData

AAC Data Fig. 4: AAC data in FLV [0]

Video Tag

Audio 데이터와 마찬가지로 video 데이터의 가장 앞에는 1byte 크기의 video header가 붙는다. 그리고 AVC(Advanced Video Coding)을 이용하여 압축된 데이터의 경우 Fig. 6의 AVC header를 따로 갖는다

Video Tag Fig. 5: FLV Video tag

  • FrameType: I/P/B frame 정보
  • CodecID: Codec 정보
  • VideoData

AVC Data Fig. 5: AVC data in FLV

References

This post is licensed under CC BY 4.0 by the author.