๐Ÿช„ FLV ํŒŒ์ผ ํ˜•์‹์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž

์ตœํ˜ธ๋นˆยท2025๋…„ 1์›” 1์ผ
0
post-thumbnail

https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


FLV ํŒŒ์ผ์ด๋ž€?

FLV(Flash Video)๋Š” ํ™•์žฅ์ž๊ฐ€ .flv์ธ ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ ํ˜•์‹์ด๋‹ค. FLV๋Š” Adobe Flash Player ๋˜๋Š” Adobe Air๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์˜ค๋””์˜ค/๋น„๋””์˜ค ์ฝ˜ํ…์ธ ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

FLV ํŒŒ์ผ์˜ ๊ฐ ํƒœ๊ทธ ์œ ํ˜•์€ ๋‹จ์ผ ์ŠคํŠธ๋ฆผ์„ ๊ตฌ์„ฑํ•˜๋ฉฐ FLV ํŒŒ์ผ์—๋Š” ํ•จ๊ป˜ ๋™๊ธฐํ™”๋˜๋Š” ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆผ๊ณผ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ์ด ํ•˜๋‚˜๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋‹จ์ผ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ๋…๋ฆฝ ์ŠคํŠธ๋ฆผ์„ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.
๋˜ํ•œ, SWF ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ FLV ํŒŒ์ผ์€ ๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ ์ •์ˆ˜๋ฅผ ๋น…-์—”๋””์•ˆ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ์ €์žฅํ•œ๋‹ค.

FLV ํŒŒ์ผ ์žฌ์ƒ ์‹œ, FLV ํƒœ๊ทธ์˜ ์‹œ๊ฐ„ ์ˆœ์„œ๋Š” FLV ํƒ€์ž„์Šคํƒฌํ”„์—๋งŒ ์˜์กดํ•œ๋‹ค. ํŽ˜์ด๋กœ๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹์— ๋‚ด์žฅ๋œ ๋ชจ๋“  ํƒ€์ด๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์‹œ๋œ๋‹ค.



๊ตฌ์„ฑ ์š”์†Œ

FLV ํŒŒ์ผ์€ ํ—ค๋”์™€ ํŒจํ‚ท์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋ชจ๋“  FLV ํŒŒ์ผ์€ ํ—ค๋”๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

๋‹จ, ์—ฌ๊ธฐ์„œ FLV ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ค๋ช…์€ version 1์— ํ•ด๋‹นํ•œ๋‹ค,


FLV Header

  • FLV Header์˜ ๊ธฐ๋ณธ๊ฐ’์€ ๋ณดํ†ต 9์ด๋‹ค.
    • (Signature(1) * 3 + version(1) + Flag(1) + DataOffset(4))
  • ์ƒˆ๋กœ ํ™•์žฅ๋œ ํ—ค๋”๋ฅผ ๊ฑด๋„ˆ๋›ธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ตฌ์„ฑ์š”์†Œ
    • Signature : FLV๋ผ๋Š” ๊ฐ’์ด ๋“ค์–ด์™€์•ผ ํ•œ๋‹ค. ๊ฐ 8๋ฐ”์ดํŠธ์”ฉ ์ด 3๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์˜ค๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ํ•„๋“œ๋Š” ์ˆœ์„œ๋Œ€๋กœ F, L, V๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ˆœ์„œ๋Œ€๋กœ 0x46, 0x4C, 0x56 ๊ฐ€ ์™€์•ผ๋งŒ ํ•œ๋‹ค.
    • Version : 1๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๋‹ค. ์ฆ‰, 0x01๋งŒ ์œ ํšจํ•˜๋‹ค.(version 1์˜ ๊ฒฝ์šฐ)
    • Flag
      • TypeFlagsReserved : 5๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฐ˜๋“œ์‹œ 0์ด์–ด์•ผ ํ•œ๋‹ค.
      • TypeFlagsAudio : 1๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์˜ค๋””์˜ค ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.
      • TypeFlagsReserved : 1๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฐ˜๋“œ์‹œ 0์ด์–ด์•ผ ํ•œ๋‹ค.
      • TypeFlagsVideo : 1๋น„ํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋น„๋””์˜ค ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.
    • DataOffset : 4๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํŒŒ์ผ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ณธ๋ฌธ ์‹œ์ž‘๊นŒ์ง€์˜ ์˜คํ”„์…‹(์ฆ‰, ํ—ค๋” ํฌ๊ธฐ)์„ ์˜๋ฏธํ•œ๋‹ค.

Flag ์˜ ๊ฐ’์— ๋”ฐ๋ผ ์ด FLV ํŒŒ์ผ์ด ์–ด๋–ค ๋ฐ์ดํ„ฐ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  1. TypeFlagsAudio ๊ฐ€ 1์ด๊ณ  TypeFlagsVideo ๊ฐ€ 1์ธ ๊ฒฝ์šฐ
    • 00000/1/0/1 โ†’ ๋น„๋””์˜ค, ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์˜จ๋‹ค.
  2. TypeFlagsAudio ๊ฐ€ 1์ด๊ณ  TypeFlagsVideo ๊ฐ€ 0์ธ ๊ฒฝ์šฐ
    • 00000/1/0/0 โ†’ ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ๋งŒ ์˜จ๋‹ค.
  3. TypeFlagsAudio ๊ฐ€ 0์ด๊ณ  TypeFlagsVideo ๊ฐ€ 1์ธ ๊ฒฝ์šฐ
    • 00000/0/0/1 โ†’ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋งŒ ์˜จ๋‹ค.

ํ—ค๋”๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋ฐฑ ํฌ์ธํ„ฐ์™€ ํƒœ๊ทธ์˜ ๋ฐ˜๋ณต์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ ๊ตฌ์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™์ด interleave๋œ๋‹ค.

  • Interleave๋ž€? Interleave(์ธํ„ฐ๋ฆฌ๋ธŒ)๋Š” ํ•œ ์ธต์˜ ๊ฒƒ๋“ค ์‚ฌ์ด์— ๋‹ค๋ฅธ ์ธต์ด๋‚˜ ํ‰๋ฉด ์กฐ๊ฐ๋“ค์„ ๋ผ์›Œ ๋„ฃ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ฌ์œ ๋ฅผ ์—ฎ์„ ๋•Œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ๋‚ด์šฉ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ๊ต์ฐจ์‹œ์ผœ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ธํ„ฐ๋ฆฌ๋น™(memory interleaving) ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์†๋„๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.



FLV file body

  • ๊ตฌ์„ฑ์š”์†Œ
    • PreviousTagSize0 : 4๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฐ˜๋“œ์‹œ 0์ด์–ด์•ผ ํ•œ๋‹ค.
    • Tag(N) : FLVTAG์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, N๋ฒˆ์งธ ํƒœ๊ทธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • PreviousTagSize(N) : 4๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ฐ’์€ ์ด์ „ ํƒœ๊ทธ์˜ ํฌ๊ธฐ์ด๋‹ค.



FLV Tag

FLV Tag๋Š” FLV ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋‹จ์œ„์ด๋‹ค. ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” Audio Tag, ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” Video Tag, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ(Ex) ๋™์˜์ƒ์˜ ์ œ๋ชฉ, ํ•ด์ƒ๋„, ๊ธธ์ด ์ •๋ณด ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋Š” Script Data Tag ์œ ํ˜•์ด ์žˆ๋‹ค.

๊ฐ ํƒœ๊ทธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์„ ๊ฐ€์ง„๋‹ค.

  • ๊ตฌ์„ฑ์š”์†Œ
    • TagType : 1๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํƒœ๊ทธ์˜ ์œ ํ˜•์„ ์˜๋ฏธํ•œ๋‹ค.
      • 8 : ์˜ค๋””์˜ค, 9 : ๋น„๋””์˜ค, 18 : ์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ, ๊ธฐํƒ€ : ์˜ˆ์•ฝ๋˜์–ด ์žˆ๋‹ค.
    • DataSize : 3๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ Data ํ•„๋“œ์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • Timestamp : 3๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํƒœ๊ทธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„(ms)์„ ์˜๋ฏธํ•œ๋‹ค.
      • ์ฒซ ๋ฒˆ์งธ ํƒœ๊ทธ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์„ค์ •๋˜๋ฉฐ, ์ดํ›„์˜ ํƒœ๊ทธ๋“ค์€ ์ƒ๋Œ€์ ์ธ ์‹œ๊ฐ„ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
    • TimestampExtended : 1๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํ™•์žฅ์„ ์œ„ํ•ด Timestamp ํ•„๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
    • StreamID : 3๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฐ˜๋“œ์‹œ 0์ด์–ด์•ผ ํ•œ๋‹ค.
    • Data : ํƒœ๊ทธ์˜ body์ด๋‹ค. ํƒœ๊ทธ์˜ ์œ ํ˜•์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์™€์•ผ ํ•œ๋‹ค.
  • Data ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ํ•ญ์ƒ 11๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

FLV์—์„œ Timestamp์™€ TimestampExtended ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

FLV์—์„œ๋Š” ์‹œ๊ฐ„ ๊ฐ’์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ํ‘œํ˜„ํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ Timestamp ํ•„๋“œ๋Š” 24๋น„ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด 1677๋งŒ ๋ฐ€๋ฆฌ์ดˆ (์•ฝ 4์‹œ๊ฐ„ 39๋ถ„)๊นŒ์ง€๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋” ํฐ ์‹œ๊ฐ„ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œTimestampExtended ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ธฐ๋ณธ Timestamp ํ•„๋“œ๋Š” ํ•˜์œ„ 24๋น„ํŠธ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , Timestamp Extended ํ•„๋“œ๋Š” ์ƒ์œ„ 8๋น„ํŠธ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, Timestamp (24๋น„ํŠธ) + Timestamp Extended (8๋น„ํŠธ) = ์ด 32๋น„ํŠธ์˜ S132 ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ตœ๋Œ€ ์•ฝ 49์ผ ์ •๋„์˜ ์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.


์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด Timestamp ํ•„๋“œ์™€ TimestampExtended ํ•„๋“œ๋ฅผ ํ•ฉ์ณ์„œ ์ „์ฒด 32๋น„ํŠธ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž.

  • Timestamp ํ•„๋“œ (24๋น„ํŠธ): 0x00FFAA (16์ง„์ˆ˜ ๊ฐ’)
  • Timestamp Extended ํ•„๋“œ (8๋น„ํŠธ): 0x12 (16์ง„์ˆ˜ ๊ฐ’)

Timestamp Extended ๊ฐ’์„ ์ƒ์œ„ 8๋น„ํŠธ๋กœ ์ด๋™ (์™ผ์ชฝ์œผ๋กœ 24๋น„ํŠธ ์ด๋™)

0x12 << 24 = 0x12000000

Timestamp ๊ฐ’์„ ํ•˜์œ„ 24๋น„ํŠธ๋กœ ๋”ํ•จ

0x12000000 + 0x00FFAA = 0x1200FFAA

์ „์ฒด 32๋น„ํŠธ ์‹œ๊ฐ„ ๊ฐ’์€ 0x1200FFAA๋กœ

์ด๋ฅผ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด 302014186 ๋ฐ€๋ฆฌ์ดˆ, ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ์•ฝ 3์ผ 11์‹œ๊ฐ„ 46๋ถ„ 54์ดˆ์— ํ•ด๋‹นํ•œ๋‹ค.


Audio Tag, Video Tag, Script Data Tag์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํžˆ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด ?

https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf 6p๋ฅผ ์ฐธ๊ณ 

0๊ฐœ์˜ ๋Œ“๊ธ€