๐Ÿ“น ๋น„๋””์˜ค ์ „์†ก ํ”„๋กœํ† ์ฝœ - 1๏ธโƒฃ RTMP

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

RTMP๋ž€?

RTMP๋Š” Real-Time Messaging Protocol์˜ ์•ฝ์ž์ด๋ฉฐ, ๋ผ์ด๋ธŒ ์˜จ๋ผ์ธ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธฐ์ˆ ์ด๋‹ค. Adobe์— ๋”ฐ๋ฅด๋ฉด, RTMP๋Š” ์ ์ ˆํ•œ ์ „์†ก ํ”„๋กœํ† ์ฝœ(Ex) TCP)์„ ํ†ตํ•ด ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ „์†ก ์ŠคํŠธ๋ฆผ(Ex) ์˜ค๋””์˜ค, ๋น„๋””์˜ค ๋ฐ ๋Œ€ํ™”ํ˜• ์ฝ˜ํ…์ธ )์„ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ ๋ฐ ํŒจํ‚ทํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€ ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•œ๋‹ค.



RTMP์—์„œ ์ง€์›ํ•˜๋Š” ๋น„๋””์˜ค/์˜ค๋””์˜ค ์ฝ”๋ฑ

Audio Codecs :ย AAC, AAC-LC, HE-AAC+ v1 & v2, MP3, Speex

Video Codecs :ย H.264, VP8, VP6, Sorenson Sparkยฎ, Screen Video v1 & v2

+) ์˜ค๋””์˜ค์™€ ๋น„๋””์˜ค ์ฝ”๋ฑ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด? ๐Ÿ‘‰๐Ÿปย ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์ ํ•ฉํ•œ ์˜ค๋””์˜ค ์ฝ”๋ฑ, ๋น„๋””์˜ค ์ฝ”๋ฑ์— ๋Œ€ํ•ด



์žฅ์ /๋‹จ์ 

  • ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(5์ดˆ)
  • ์ตœ์†Œ ๋ฒ„ํผ๋ง

+) ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด? ๐Ÿ‘‰๐Ÿปย Latencyย ๋ฐย Buffering


  • ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.



๋‚ฎ์€ ํ˜ธํ™˜์„ฑ

์›๋ž˜๋„ RTMP๋Š” Flash Player, Adobe AIR ๋“ฑ RTMP ํ˜ธํ™˜ ํ”Œ๋ ˆ์ด์–ด๋งŒ ์ง€์›ํ•˜๊ณ  ๋ชจ๋ฐ”์ผ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์•˜๋‹ค. 2020๋…„ ์ดํ›„๋กœ Adobe Flash Player๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ธŒ๋ผ์šฐ์ €์—์„œ RTMP๋ฅผ ์‚ฌ์šฉํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ๋„ ์ค‘๋‹จ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ RTMP๋Š” ์ด์ œ iOS, Android, ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋Œ€๋ถ€๋ถ„ ๋‚ด์žฅ ๊ฐ€๋Šฅํ•œ ํ”Œ๋ ˆ์ด์–ด์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.

Flash ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง€์› ์ค‘๋‹จ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ RTMP๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ RTMP๋Š” ์—ฌ์ „ํžˆ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„์™€ ์ธ์ฝ”๋” ๊ฐ„์— ์†Œ์Šค ์ „์†ก์šฉ์œผ๋กœ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ๋‹ค.

์•ž์—์„œ ๋งํ–ˆ๋“ฏ์ด, RTMP๋Š” Flash ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด์™€ ํ•จ๊ป˜ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์—ˆ๋‹ค.

์˜ˆ์ „์˜ RTMP์˜ ์ž‘์—… ํ๋ฆ„์€ ์ด์™€ ๊ฐ™๋‹ค.

์ถœ์ฒ˜ : https://youtu.be/gL-yqay_-D4?si=lt2DaS-ihpryeacv

  1. ์••์ถ•๋˜์ง€ ์•Š์€ ๋””์ง€ํ„ธ ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ์‹ ํ˜ธ๊ฐ€ ์นด๋ฉ”๋ผ์—์„œ ์ธ์ฝ”๋”๋กœ ์ด๋™ํ•œ๋‹ค.
  2. ์ธ์ฝ”๋”์—์„œ๋Š” ํ•ด๋‹น ์‹ ํ˜ธ๋ฅผ ์••์ถ•ํ•˜์—ฌ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฏธ๋””์–ด ์„œ๋ฒ„๋กœ ์ „์†ก๋œ๋‹ค.
  3. ํ•ด๋‹น ๋ฏธ๋””์–ด ์„œ๋ฒ„์—์„œ๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ „ ์„ธ๊ณ„์˜ ์ˆ˜๋งŽ์€ ํ”Œ๋ž˜์‹œ ํ”Œ๋ ˆ์ด์–ด์™€ ํ•จ๊ป˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ œ RTMP๋Š” ๋น„๋””์˜ค ์ˆ˜์ง‘(video ingestion)์— ์‚ฌ์šฉ๋œ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ์ธ์ฝ”๋”์—์„œ ์Šค์œ„์ฒ˜, ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, ์„œ๋ฒ„๋กœ ๋น„๋””์˜ค ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฉ์†ก ์†Œ์Šค(์นด๋ฉ”๋ผ๋‚˜ ์บก์ฒ˜ ์นด๋“œ ๋“ฑ)๋ฅผ ์ธ์ฝ”๋”์—์„œ RTMP๋กœ ์ „์†กํ•œ ํ›„, ์œ ํŠœ๋ธŒ๋‚˜ ํŠธ์œ„์น˜์™€ ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ ์ด๋ฅผ ๋‹ค์‹œ HLS๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด๋‹ค. (๊ทธ๋ž˜์„œ ๋น„๋””์˜ค ์ˆ˜์ง‘์€ RTMP, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•˜๋Š” ๊ฒƒ์€ HLS. ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ์ž์ฃผ ๋ณด์ด๋Š” ๊ฒƒ) ์ด๋ ‡๊ฒŒ RTMP๋Š” ์ธ์ฝ”๋”์™€ ํ”Œ๋žซํผ ๊ฐ„ ์—ฐ๊ฒฐ์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

HLS๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์ด ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ ์ „๋‹ฌ์— ๋„์ž…๋จ์— ๋”ฐ๋ผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฏธ๋””์–ด ์„œ๋ฒ„๋Š” ๋ณ€ํ™”ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์กฐ์ •๋˜์—ˆ๋‹ค. RTMP๋Š” First-mile(์œ„์—์„œ ๋งํ•œ 1๋‹จ๊ณ„)์—์„œ ๋ฏธ๋””์–ด ์„œ๋ฒ„์— ์˜ํ•ด ์—ฌ์ „ํžˆ ์ˆ˜์ง‘๋˜์—ˆ์ง€๋งŒ ํ•„์š”์— ๋”ฐ๋ผ ํ”Œ๋ ˆ์ด์–ด์˜ ํ•„์š”์— ๋งž๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ๋ณ€ํ™˜ํžˆ ํ•„์š”ํ•˜๊ฒŒ ๋๋‹ค. RTMP๋Š” ์—ฌ์ „ํžˆ ๋งŽ์€ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ SRT์™€ WebRTC์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ๋“ค์ด ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์–ด ์ง€์ผœ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.



RTMP ์ˆ˜์ง‘(Ingest)๋ž€?

์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ์ฝ˜ํ…์ธ ๋ฅผ ์บก์ฒ˜ ๋ฐ ์ธ์ฝ”๋”ฉํ•˜๊ณ , RTMP ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ , ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•ด ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค์ด๋‹ค. RTMP ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ ์˜์ƒ์„ ์ดฌ์˜ํ•˜๋Š” ์นด๋ฉ”๋ผ/์ธ์ฝ”๋”์—์„œ ์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๋ฐฉ์†ก์‚ฌ์™€ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ฝ”๋”, ์นด๋ฉ”๋ผ ๋ฐ ๊ธฐํƒ€ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ผ์ด๋ธŒ ๋น„๋””์˜ค ํ”ผ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.



RTMP ์ŠคํŠธ๋ฆฌ๋ฐ(Streaming)์ด๋ž€?

RTMP ์„œ๋ฒ„์—์„œ ํŠธ๋žœ์Šค์ฝ”๋”ฉ๋œ ์˜ค๋””์˜ค ๋ฐ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋””์–ด ํ”Œ๋ ˆ์ด์–ด ๋˜๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. HLS ๋˜๋Š” DASH์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ํ˜ธํ™˜์„ฑ ์ฃผ์ œ์—์„œ๋„ ๋งํ–ˆ์ง€๋งŒ RTMP ์ŠคํŠธ๋ฆฌ๋ฐ์€ Flash ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์—ˆ๊ณ , ๋ชจ๋ฐ”์ผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฏธ์ง€์›, ์ง€์›์˜ ๋Š๊น€ ๋“ฑ๋“ฑ ๋•Œ๋ฌธ์— ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ถ”์„ธ์ด๋‹ค. ์ด์ œ ์—…๊ณ„์—์„œ๋Š” ๊ธฐ์กด ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” HTTP ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ(Ex) HLS)์„ ์„ ํ˜ธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ ์„œ๋ฒ„๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฝ˜ํ…์ธ ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์žฅ์„ฑ๊ณผ ์‹œ์ฒญ ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ABR ๋ฐฉ์‹์ด ๋”์šฑ ๋ณดํŽธํ™”๋˜์–ด์กŒ๊ณ , ๋ฐฉ์†ก์‚ฌ๊ฐ€ ์‹œ์ฒญ์ž์˜ ๊ธฐ๊ธฐ ๋ฐ ์—ฐ๊ฒฐ์— ๋งž์ถฐ ์ฝ˜ํ…์ธ ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.





RTMP ๋™์ž‘ ๋ฐฉ์‹

์ด ๊ณผ์ •์€ ํฌ๊ฒŒ Handshake, Connect, Stream 3๋‹จ๊ณ„๋กœ ๋‚˜๋‰œ๋‹ค.

๋จผ์ €, RTMP ์—ฐ๊ฒฐ์€ Handshake๋กœ ์‹œ์ž‘ํ•œ๋‹ค. RTMP๋Š” TCP ์œ„์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ three-way handshake๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Handshake : ์„œ๋ฒ„์™€ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์„ค์ •

C0~2, S0~2๋Š” ๋ชจ๋‘ ์ •์  ํฌ๊ธฐ chunk์ด๋‹ค.

  • C0๊ณผ S0 ํŒจํ‚ท ํ˜•์‹ : 8๋น„ํŠธ ์ •์ˆ˜ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ๋‹จ์ผ ์˜ฅํ…Ÿ(== 1 byte)

  • version : C0 ํŒจํ‚ท์—์„œ ์ด ํ•„๋“œ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” RTMP ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „์„ ์„œ๋ฒ„์— ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๊ณ , S0์—์„œ ์ด ํ•„๋“œ๋Š” ์„œ๋ฒ„์—์„œ ์„ ํƒํ•œ RTMP ๋ฒ„์ „์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๋ฒ„์ „์€ ์ฃผ๋กœ 3์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฒ„์ „์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์„œ๋ฒ„๋Š” 3์œผ๋กœ ์‘๋‹ตํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

    • 0 ~ 2 : ์ด์ „ ๋…์  ์ œํ’ˆ์—์„  ๋” ์ด์ƒ ์‚ฌ์šฉ X, 4 ~ 31 : ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Œ, 32 ~ 255 : ํ—ˆ์šฉ X


  • C1๊ณผ S1 ํŒจํ‚ท ํ˜•์‹ : 1536 byte

  • time : ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋œ๋‹ค. ์ด ํƒ€์ž„์Šคํƒฌํ”„๋Š” ์—”๋“œํฌ์ธํŠธ ๊ฐ„์˜ ์ „์†ก๋  ์˜ˆ์ •์ธ ๋ชจ๋“  chunk๋“ค์— ๋Œ€ํ•œ ๊ธฐ๊ฐ„(epoch)์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ chunk stream์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—”๋“œํฌ์ธํŠธ๋Š” ๋‹ค๋ฅธ chunk stream์˜ ํƒ€์ž„์Šคํƒฌํ”„์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • zero : ๋‹ค 0์ด์–ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒ๋ฉด, ์ด๋Š” ์˜ˆ์•ฝ๋œ ํ•„๋“œ์ด๊ธฐ ๋•Œ๋ฌธ!

  • random data : ๋ฌด์ž‘์œ„ ๊ฐ’. ๋ณด์•ˆ์ด ์š”๊ตฌ๋˜๋Š” ๊ฐ’์€ ์•„๋‹ˆ๋‹ค.


  • C2๊ณผ S2 ํŒจํ‚ท ํ˜•์‹ : 1536 byte

    C2์™€ S2๋Š” ๊ฐ๊ฐ C1๊ณผ S1์˜ echo์— ๊ฐ€๊น๋‹ค. ํƒ€์ž„์Šคํƒฌํ”„์˜ ๋ณต์‚ฌ๋ณธ ๋А๋‚Œ?

  • time : ์ด ํ•„๋“œ์—๋Š” ์ƒ๋Œ€๋ฐฉ์ด ์ด์ „ ์‘๋‹ต์—์„œ ๋ณด๋‚ธ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋œ๋‹ค.

    • C2์˜ ๊ฒฝ์šฐ S1, S2์˜ ๊ฒฝ์šฐ C1
  • time2 : ์ƒ๋Œ€๋ฐฉ์ด ๋ณด๋‚ธ ์ด์ „ ํŒจํ‚ท(S1 ๋˜๋Š” C1)์„ ์ฝ์€ ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋œ๋‹ค.

  • random echo



Handshake๋Š” ํด๋ผ์ด์–ธํŠธ(์ธ์ฝ”๋”ฉ ์†Œํ”„ํŠธ์›จ์–ด ๋˜๋Š” ํ•˜๋“œ์›จ์–ด)๊ฐ€ C0 ๋ฐ C1 ํŒจํ‚ท์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘๋œ๋‹ค. ์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” C0 ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  C1 ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, C2๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— S1์ด ์ˆ˜์‹ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ณ , ๊ทธ ์™ธ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณด๋‚ด๊ธฐ ์ „์—๋Š” S2๊ฐ€ ์ˆ˜์‹ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. (์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ ์ฐธ๊ณ )

Uninitialized ์ƒํƒœ์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋จผ์ € ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „(C0)์„ ์ „์†กํ•œ๋‹ค. ์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๋‹ค. ๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๋ฒ„์ „์„ ์ง€์›ํ•œ๋‹ค๋ฉด, ์‘๋‹ต์œผ๋กœ S0 ๋ฐ S1์„ ๋ณด๋‚ธ๋‹ค. ๋งŒ์•ฝ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ ๋‹ค์Œ, ํŒจํ‚ท S1์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์„œ๋ฒ„๋Š” ํŒจํ‚ท C1์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” Version Sent ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ฐ๊ฐ S1 ๊ณผ C1 ์„ ๋ฐ›์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ํŒจํ‚ท C2๋ฅผ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๋Š” ํŒจํ‚ท S2๋ฅผ ๋ณด๋‚ธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Ack Sent ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

Ack Sent ์ƒํƒœ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” S2์™€ C2 ๋ฅผ ๋ฐ›์œผ๋ฉด ๋น„๋กœ์†Œ Handshake๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค! ์ด์ œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


Connect

์—ฐ๊ฒฐ ๋‹จ๊ณ„์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” AMF(Action Message Format) ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.(ํ•˜๋‚˜ ์ด์ƒ์˜ Chunk Stream์„ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ) ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”์‹œ์ง€์— ์—ฐ๊ฒฐ URL, ์˜ค๋””์˜ค ์ฝ”๋ฑ, ๋น„๋””์˜ค ์ฝ”๋ฑ๊ณผ ๊ฐ™์€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ณ , Set Peer Bandwidth , Window Acknowledgement Size ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋„ ๊ตํ™˜ํ•œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋จผ์ € ์‘๋‹ตํ•˜์—ฌ ์—ฐ๊ฒฐ์ด ๋ชจ๋‘ ์„ค์ •๋˜๋ฉด ์„œ๋ฒ„๊ฐ€ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


Stream

  • ์ด๋Š” ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœ์„ธ์Šค์—์„œ RTMP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.(์š”์ฆ˜์€ HLS๊ฐ€ ์ถ”์„ธ)

Handshake ๋ฐ Connect ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ–ˆ์œผ๋ฏ€๋กœ ์ด์ œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, createStream, play, receiveAudio, seek, pause ๋“ฑ๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋””์˜ค๊ฐ€ ์ง€์‹œ์— ๋”ฐ๋ผ ์ „์†ก๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.





๋ณธ๊ฒฉ์ ์œผ๋กœ RTMP ํ†บ์•„๋ณด๊ธฐ

RTMP ์šฉ์–ด ์ •๋ฆฌ

RTMP์— ๋Œ€ํ•ด์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜ค๋Š” ๊ฐœ๋…๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

(Adobe RTMP Specification ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

Payload : ํŒจํ‚ท์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ(Ex) ์˜ค๋””์˜ค ์ƒ˜ํ”Œ ๋˜๋Š” ์••์ถ•๋œ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ)

Packet : ๊ณ ์ • ํ—ค๋”์™€ Payload ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ํŒจํ‚ท

Port : ์ „์†ก ํ”„๋กœํ† ์ฝœ์ด ์ง€์ •๋œ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ ๋‚ด์˜ ์—ฌ๋Ÿฌ ๋Œ€์ƒ์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. (TCP/IP ํ”„๋กœํ† ์ฝœ์€ ์ž‘์€ ์ •์ˆ˜(์ˆซ์ž)๋ฅผ ์‚ฌ์šฉํ•ด์„œ Port๋ฅผ ๊ตฌ๋ถ„)

Transport address : ์ „์†ก ๋ ˆ๋ฒจ์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์™€ Port์˜ ์กฐํ•ฉ(Ex) IP ์ฃผ์†Œ + TCP Port). Packet์€ ์ด ์ „์†ก ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

Message Stream : ๋ฉ”์‹œ์ง€๊ฐ€ ํ๋ฅด๋Š” ํ†ต๋กœ. Ex) ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์—์„œ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅด๋Š” ๋…ผ๋ฆฌ์  ํ†ต๋กœ

Message Stream ID : ๊ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์–ด๋А Message Stream์—์„œ ํ˜๋Ÿฌ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„ ๋ฒˆํ˜ธ. ์ฆ‰, ์–ด๋–ค ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€์ธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Chunk : ํฐ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆˆ ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๊ธฐ ์ „, ๋” ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜๊ณ  ์ธํ„ฐ๋ฆฌ๋ธŒ(interleave)๋œ๋‹ค. ํ•˜์ง€๋งŒ Chunk๋Š” ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์— ๊ฑธ์ณ ๋ชจ๋“  ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„ ์ˆœ์„œ์— ๋”ฐ๋ผ ์—”๋“œํˆฌ์—”๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

  • ์ธํ„ฐ๋ฆฌ๋ธŒ(interleave)๋œ๋‹ค๋ผ๋Š” ๋œป์€? ์ธํ„ฐ๋ฆฌ๋ธŒ๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ์ฒญํฌ๋ฅผ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์„ž์–ด์„œ ๋ณด๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋””์˜ค ์ฒญํฌ(A1, A2)์™€ ์˜ค๋””์˜ค ์ฒญํฌ(B1, B2)๊ฐ€ ์žˆ๋‹ค๋ฉด, A1 โ†’ B1 โ†’ A2 โ†’ B2 ์ˆœ์„œ๋กœ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๋ณด๋‚ด๋Š” ๊ฒƒ. ์ด๋ ‡๊ฒŒ ์„ž์–ด์„œ ๋ณด๋‚ด์ง€๋งŒ, ๊ฐ ๋ฉ”์‹œ์ง€์˜ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก ํƒ€์ž„์Šคํƒฌํ”„์— ๊ธฐ๋ฐ˜ํ•ด ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ์˜ A1 ์ฒญํฌ๊ฐ€ ๋จผ์ € ์ „์†ก๋˜๊ณ , ๋‹ค์Œ ๋น„๋””์˜ค ์ฒญํฌ์ธ A2๊ฐ€ ๊ทธ ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋„์ฐฉํ•˜๋„๋ก ๋ณด์žฅ๋œ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์„ ์„ž์–ด์„œ ๋ณด๋‚ด๋”๋ผ๋„, ๊ฐ ์ŠคํŠธ๋ฆผ ๋‚ด์—์„œ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•œ๋‹ค.

Chunk Stream : ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ(ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„, ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ) ์ฒญํฌ๋“ค์ด ํ๋ฅด๋Š” ๋…ผ๋ฆฌ์  ํ†ต๋กœ

Chunk Stream ID : ๊ฐ ์ฒญํฌ๊ฐ€ ์–ด๋А Chunk Stream์— ์†ํ•ด ์žˆ๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„ ๋ฒˆํ˜ธ.

Multiplexing : ๊ฐœ๋ณ„ ์˜ค๋””์˜ค/๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด ์—ฌ๋Ÿฌ ๋น„๋””์˜ค์™€ ์˜ค๋””์˜ค๋ฅผ ๋™์‹œ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค. Ex) ์˜์ƒ๊ณผ ์†Œ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๋ณด๋‚ด์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด ์ „์†กํ•˜๋Š” ๊ฒƒ

DeMultiplexing : ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ์˜ ๋ฐ˜๋Œ€ ๊ณผ์ •์œผ๋กœ, ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„ ์˜ค๋””์˜ค/๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ถ„๋ฆฌํ•˜์—ฌ ์›๋ž˜์˜ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ๋กœ ๋ณต์›ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

RPC : ํด๋ผ์ด์–ธํŠธ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ์›๊ฒฉ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์ด๋‹ค. Ex) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์žˆ๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹

Metadata : ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…

Application Instance : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋Š” ์„œ๋ฒ„์— ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งํ•œ๋‹ค. ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐ๋˜์–ด ํ†ต์‹ ์„ ํ•œ๋‹ค.

AMF : AMF๋Š” ActionScript ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”(์ปดํ“จํ„ฐ์—์„œ ์‰ฝ๊ฒŒ ์ „์†กํ•˜๊ณ  ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜)ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ด์ง„ ํ˜•์‹์ด๋‹ค. AMF 0๊ณผ AMF 3 ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ์žˆ๋‹ค.

RTMP๋Š” ์˜์ƒ, ์Œ์„ฑ, ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ „์†กํ•˜๊ณ , ๊ฐ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.



RTMP Chunk Stream

RTMP ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ „์†ก ๋ฐฉ์‹์œผ๋กœ, ๊ฐ ์ฒญํฌ ์ŠคํŠธ๋ฆผ์€ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์—์„œ ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Connection ๊ด€๋ฆฌ ๋ฉ”์‹œ์ง€, Stream ์ƒ์„ฑ/์ œ์–ด ๋ฉ”์‹œ์ง€, ์‹ค์ œ ๋ฏธ๋””์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ Chunk Stream์„ ํ†ตํ•ด Connection, Stream์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.

์ฒญํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์œ„ ์ˆ˜์ค€ ํ”„๋กœํ† ์ฝœ์˜ ํฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋” ์ž‘์€ ๋ฉ”์‹œ์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ๋œ ๊ฐ ์ฒญํฌ์—๋Š” Chunk Stream ID๋ผ๋Š” ์‹๋ณ„์ž๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ์‹๋ณ„์ž๋กœ ์ˆ˜์‹ ์ž ์ธก์—์„œ ๋ฉ”์‹œ์ง€๋กœ ์กฐ๋ฆฝ๋œ๋‹ค. ์ฒญํฌ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค์ง€๋งŒ, ์“ฐ๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ค ๋Œ€์—ญํญ์ด ๋‚ฎ์€ ์—ฐ๊ฒฐ์—์„œ ๋‹ค๋ฅธ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋„ˆ๋ฌด ์ž‘์€ ์ฒญํฌ๋Š” ๋†’์€ ๋น„ํŠธ ์ „์†ก๋ฅ  ์ŠคํŠธ๋ฆฌ๋ฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.


Chunk Format

๊ฐ ์ฒญํฌ๋Š” ํ—ค๋”์™€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ํ—ค๋” ์ž์ฒด๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

Basic Header

  • ์ฒญํฌ ์œ ํ˜•(fmt)์™€ Chunk Stream ID(cs id)๋ฅผ ์ธ์ฝ”๋”ฉ
  • ๊ฐ€๋ณ€ ๊ธธ์ด ํ•„๋“œ์ธ cs id ID์— ๋”ฐ๋ผ 1 ~ 3 byte๋กœ ๊ฒฐ์ •(0์€ 2byte, 1์€ 3byte)
  • ๊ตฌ์„ฑ ์š”์†Œ
    • fmt(2 bit) : ์ธ์ฝ”๋”ฉ๋œ ๋ฉ”์‹œ์ง€ ํ—ค๋”์˜ ํ˜•์‹์„ ๊ฒฐ์ •
    • cs id(2 bit) : 2-63 ์‚ฌ์ด์˜ ๊ฐ’์— ๋Œ€ํ•œ Chunk Stream ID
    • cs id - 64(8 or 16 bit) : Chunk Stream ID์—์„œ 64๋ฅผ ๋บ€ ๊ฐ’.
    • Ex) ID 365๋Š” cs id๋Š” 1๋กœ ํ‘œ์‹œ, cs id - 64๋Š” 16๋น„ํŠธ 301๋กœ ํ‘œ์‹œํ•œ๋‹ค.

Message Header

  • Basic Header ์˜ fmt ๊ฐ’์— ๋”ฐ๋ผ 0, 3, 7, 11 byte์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ „์†ก ์ค‘์ธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ •๋ณด(์ „์ฒด ๋˜๋Š” ์ผ๋ถ€)๋ฅผ ์ธ์ฝ”๋”ฉ

  • ๊ณตํ†ต ํ—ค๋” ํ•„๋“œ

    • Timestamp Delta (3 bytes)
      • Type 1, Type 2 ์ฒญํฌ์—์„œ ์‚ฌ์šฉ
      • ์ด์ „ ์ฒญํฌ์™€ ํ˜„์žฌ ์ฒญํฌ์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ํ‘œ์‹œ
      • 16777215 ๋ฏธ๋งŒ์ด๋ฉด ์‹ค์ œ delta ๊ฐ’ ์‚ฌ์šฉ
      • 16777215(0xFFFFFF) ์ด์ƒ์ด๋ฉด Extended Timestamp ํ•„๋“œ ์‚ฌ์šฉ
    • Message Length (3 bytes)
      • Type 0, Type 1 ์ฒญํฌ์—์„œ๋งŒ ์‚ฌ์šฉ
      • ์ „์ฒด ๋ฉ”์‹œ์ง€์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„
      • ์ฒญํฌ ํŽ˜์ด๋กœ๋“œ ๊ธธ์ด์™€๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
        • ์ผ๋ฐ˜ ์ฒญํฌ: ์ตœ๋Œ€ ์ฒญํฌ ํฌ๊ธฐ
        • ๋งˆ์ง€๋ง‰ ์ฒญํฌ: ๋‚จ์€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
        • ์ž‘์€ ๋ฉ”์‹œ์ง€: ์ „์ฒด ๊ธธ์ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • Message Type ID (1 byte)
      • Type 0, Type 1 ์ฒญํฌ์—์„œ๋งŒ ์‚ฌ์šฉ
      • ๋ฉ”์‹œ์ง€์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • Message Stream ID (4 bytes)
      • Type 0 ์ฒญํฌ์—์„œ๋งŒ ์‚ฌ์šฉ
      • Little-endian ํ˜•์‹์œผ๋กœ ์ €์žฅ
      • ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ํ•˜๋‚˜์˜ ์ฒญํฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ ๊ฐ€๋Šฅ (but ํ—ค๋” ์••์ถ• ์ด์  ์ƒ์‹ค)
  • ์œ ํ˜• 0

    • 11 byte
    • ์ฒญํฌ ์ŠคํŠธ๋ฆผ์„ ์‹œ์ž‘ํ•  ๋•Œ, ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋ฉด(Ex) ์˜์ƒ 10์ดˆ ์ „์œผ๋กœ ๋Œ๋ฆฌ๊ธฐ?) ๋ฐ˜๋“œ์‹œ ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ๋งŒ์•ฝ TimeStamp๊ฐ€ 16777215(0xFFFFFF)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด Extended Timestamp๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” 16777215์„ ์ €์žฅํ•˜๋‹ค.
    • 3 bytes(24๋น„ํŠธ)๋กœ๋Š” ์ตœ๋Œ€ 16777215๊นŒ์ง€๋งŒ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋” ํฐ ๊ฐ’์€ Extended Timestamp์— ์ €์žฅํ•˜๊ณ  ํ˜„์žฌ Timestamp์—๋Š” Extended Timestamp์— ์›๋ณธ ์‹œ๊ฐ„์ด ์ €์žฅ๋˜์–ด ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” 16777215์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์œ ํ˜• 1

    • ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ ID๋ฅผ ์ œ์™ธํ•œ 7 byte์˜ ๊ธธ์ด
    • ์ด์ „ ์ฒญํฌ์™€ ๋™์ผํ•œ ์ŠคํŠธ๋ฆผ ID๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•
    • ๋™์˜์ƒ ๊ฐ™์€ ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ์€ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€ ์ดํ›„ ๊ฐ ์ƒˆ ๋ฉ”์‹œ์ง€์˜ ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ์— ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • Timestamp Delta๋Š” ์ ˆ๋Œ€ ์‹œ๊ฐ„์ด ์•„๋‹Œ ์ด์ „ ๋ฉ”์‹œ์ง€์™€์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋” ์ ์€ ๋น„ํŠธ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์œ ํ˜• 2

    • ์ŠคํŠธ๋ฆผ ID๋‚˜ ๋ฉ”์‹œ์ง€ ๊ธธ์ด๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š” 3 byte์˜ ๊ธธ์ด
    • ์ด์ „ ์ฒญํฌ์™€ ๋™์ผํ•œ ์ŠคํŠธ๋ฆผ ID ๋ฐ ๋ฉ”์‹œ์ง€ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ์ผ์ •ํ•œ ํฌ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ง„ ์ŠคํŠธ๋ฆผ์€ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€ ์ดํ›„ ๊ฐ ๋ฉ”์‹œ์ง€์˜ ์ฒซ๋ฒˆ์จฐ ์ฒญํฌ์— ๋Œ€ํ•ด ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ์œ ํ˜• 3
    • ๋ฉ”์‹œ์ง€ ํ—ค๋”, ์ŠคํŠธ๋ฆผ ID, ๋ฉ”์‹œ์ง€ ๊ธธ์ด ๋ฐ Timestamp Delta ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ์œ ํ˜•์ด๋‹ค.
    • ๋ฉ”์‹œ์ง€๋“ค์˜ ํฌ๊ธฐ, ์ŠคํŠธ๋ฆผ ID, ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ๋ชจ๋‘ ๋™์ผํ•˜๊ฑฐ๋‚˜, ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ๋  ๋•Œ ๋ฐ˜๋“œ์‹œ ์œ ํ˜• 3์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์ฒซ ๋ฉ”์‹œ์ง€์™€ ๋‘ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„ ์ฐจ์ด๊ฐ€ ์ฒซ ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„์™€ ๋™์ผํ•  ๋•Œ ์œ ํ˜• 3์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Extended Timestamp

  • 6777215(0xFFFFFF)๋ณด๋‹ค ํฐ ํƒ€์ž„์Šคํƒฌํ”„ ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ๋ธํƒ€๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฐ Chunk Type๋ณ„ ์‚ฌ์šฉ ์กฐ๊ฑด
    • Type 0 : ํƒ€์ž„์Šคํƒฌํ”„ ํ•„๋“œ๊ฐ€ 0xFFFFFF์ผ ๋•Œ ์‚ฌ์šฉ
    • Type 1, 2 : ํƒ€์ž„์Šคํƒฌํ”„ ๋ธํƒ€ ํ•„๋“œ๊ฐ€ 0xFFFFFF์ผ ๋•Œ ์‚ฌ์šฉ
    • Type 3 : ๊ฐ™์€ chunk stream ID๋ฅผ ๊ฐ€์ง„ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์ฒญํฌ๊ฐ€ Extended Timestamp ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉ

Chunk Data

  • ๊ฐ€๋ณ€ ํฌ๊ธฐ
  • ์ฒญํฌ์˜ ํŽ˜์ด๋กœ๋“œ. ์ฆ‰, ํŒจํ‚ท์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ



RTMP Messages

RTMP๋Š” ์›๋ž˜ RTMP ์ฒญํฌ ์ŠคํŠธ๋ฆผ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ „์†ก ํ”„๋กœํ† ์ฝœ(Ex) TCP/IP, WebSocket ๋“ฑ)์„ ์‚ฌ์šฉํ•ด์„œ RTMP Message๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด RTMP Message๋Š” ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์˜ค๋””์˜ค, ๋น„๋””์˜ค, ๋ฐ์ดํ„ฐ ๋˜๋Š” ๊ธฐํƒ€ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์‹œ์ง€ ์œ ํ˜•์œผ๋กœ๋Š” ์˜ค๋””์˜ค ๋ฉ”์‹œ์ง€, ๋น„๋””์˜ค ๋ฉ”์‹œ์ง€, ๋ช…๋ น ๋ฉ”์‹œ์ง€, ๊ณต์œ  ๊ฐ์ฒด ๋ฉ”์‹œ์ง€, ๋ฐ์ดํ„ฐ ๋ฉ”์‹œ์ง€ ๋ฐ ์‚ฌ์šฉ์ž ์ œ์–ด ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋‹ค.

  • Message Header

    • Message Type (1 byte): ๋ฉ”์‹œ์ง€ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • Payload Length (3 byte) : ํŽ˜์ด๋กœ๋“œ์˜ ํฌ๊ธฐ๋ฅผ byte๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • Timestamp(4 byte) : ๋ฉ”์‹œ์ง€์˜ ํƒ€์ž„์Šคํƒฌํ”„
    • Message Stream Id(3 byte) : ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’
  • Message Payload

    • ๋ฉ”์‹œ์ง€์— ํฌํ•จ๋œ ์‹ค์ œ ๋ฐ์ดํ„ฐ (Ex) ์ผ๋ถ€ ์˜ค๋””์˜ค ์ƒ˜ํ”Œ ๋˜๋Š” ์••์ถ•๋œ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ)





์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” RTMP ์†ก์ถœ + HLS ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹

RTMP์™€ HLS๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ๋†’์ด์ง€ ์•Š๊ณ ๋„ ํ˜ธํ™˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. RTMP๋กœ ์†ก์ถœ

์ŠคํŠธ๋ฆฌ๋จธ๋Š” OBS(์˜คํ”ˆ ๋ธŒ๋กœ๋“œ์บ์Šคํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด) ๋˜๋Š” XSplit๊ณผ ๊ฐ™์€ ์ธ์ฝ”๋”ฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RTMP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„๋กœ ์ŠคํŠธ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค.

2. ํŠธ๋žœ์Šค์ฝ”๋”ฉ ๋ฐ ํ”„๋กœํ† ์ฝœ ๋ณ€ํ™˜

์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„๋Š” ์ˆ˜์‹ ๋œ RTMP ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์•„์„œ ํŠธ๋žœ์Šค์ฝ”๋”ฉ์„ ์ง„ํ–‰ํ•œ๋‹ค. ํŠธ๋žœ์Šค์ฝ”๋”ฉ์€ ์›๋ณธ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์–‘ํ•œ ํ•ด์ƒ๋„(720p, 1080p ๋“ฑ)์™€ ๋น„ํŠธ๋ ˆ์ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹œ์ฒญ์ž์˜ ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋งž์ถฐ ์ ์‘ํ˜• ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด ๊ณผ์ •์—์„œ RTMP ํ”„๋กœํ† ์ฝœ๋กœ ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ HLS ํ”„๋กœํ† ์ฝœ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•œ๋‹ค.

3. HLS ์ŠคํŠธ๋ฆฌ๋ฐ

๋ณ€ํ™˜๋œ HLS ์ŠคํŠธ๋ฆผ์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„์—์„œ ์‹œ์ฒญ์ž์—๊ฒŒ ์ œ๊ณต๋œ๋‹ค. HLS๋Š” ์ฒญํฌ ๋‹จ์œ„๋กœ ๋น„๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ผ ์‹œ์ฒญ์ž์˜ ์žฌ์ƒ ํ™˜๊ฒฝ์— ๋งž๋Š” ํ™”์งˆ๋กœ ์‹ค์‹œ๊ฐ„ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

4. ์‹œ์ฒญ์ž๋Š” HLS๋กœ ์ŠคํŠธ๋ฆผ ์žฌ์ƒ

์‹œ์ฒญ์ž๋Š” HLS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋น„๋””์˜ค๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ›๋Š”๋‹ค. ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด๋Š” ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” M3U8 ํŒŒ์ผ(๋น„๋””์˜ค ์ฒญํฌ ๋ชฉ๋ก)์„ ์ฝ์–ด ์™€์„œ, ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋น„ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์„ ํƒํ•ด ์žฌ์ƒํ•œ๋‹ค.





๐Ÿค” ๊ถ๊ธˆํ•œ ์ 

1๏ธโƒฃ ๊ตฌ๊ธ€ ๋ฏธํŠธ๋‚˜ ํŽ˜์ด์Šคํƒ€์ž„ ๊ฐ™์€ ํ™”์ƒํšŒ์˜๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ฃผ๋กœ WebRTC ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์™œ ํ™”์ƒํšŒ์˜๋ฅผ ์œ„ํ•ด์„œ ์ฃผ๋กœ WebRTC ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ• ๊นŒ?

์šฐ์„  ํ™”์ƒํšŒ์˜ ํ”„๋กœํ† ์ฝœ์ด ๊ฐ€์ ธ์•ผํ•˜๋Š” ์ค‘์š”ํ•œ ์ ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

  1. ๋”œ๋ ˆ์ด๊ฐ€ ์งง์•„์•ผ ํ•œ๋‹ค. (์ฃผ๋กœ 0.5์ดˆ ๋‚ด์™ธ)
  2. ํ™”์งˆ์ด ์—„์ฒญ ์ข‹์„ ํ•„์š”๋Š” ์—†๋‹ค.
  3. ๋†’์€ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. (Ex) ์•ˆ๋“œ๋กœ์ด๋“œ, ์•„์ดํฐ ์ƒ๊ด€์—†์ด ์คŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)

์ด๋Ÿฌํ•œ ์ ๋“ค์„ ๊ฐ€์ง€๋Š” ํ”„๋กœํ† ์ฝœ๋กœ๋Š” WebRTC ํ”„๋กœํ† ์ฝœ์ด ์ ํ•ฉํ•˜๋‹ค. WebRTC๋Š” ํ”ผ์–ด ํˆฌ ํ”ผ์–ด(P2P) ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด ์ค‘๊ฐ„ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ, ์˜์ƒ ๋ฐ ์Œ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ๋˜ํ•œ, ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์—†์ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” ์†์‰ฝ๊ฒŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ํ™”์ƒํšŒ์˜์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด RTMP๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฐ€? ๐Ÿค” ๋ถˆ๊ฐ€๋Šฅ์ด๋ผ๊ธฐ ๋ณด๋‹ค ๋ถ€์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค. RTMP๋Š” ์ฃผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฐฉ์†ก ์†ก์ถœ ์‹œ ์ผ์ •ํ•œ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉ์ด ์ค‘์š”ํ•œ ํ™”์ƒํšŒ์˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ๋˜ํ•œ, RTMP๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ๊ฐ€์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์„œ๋ฒ„ ๋ถ€๋‹ด์ด ์ฆ๊ฐ€๋œ๋‹ค.


2๏ธโƒฃ HLS์„ ์‚ฌ์šฉํ•ด์„œ RTMP ๋Œ€์‹  ๋น„๋””์˜ค๋ฅผ ์ˆ˜์ง‘(Ingest)/์†ก์ถœํ•  ์ˆ˜ ์—†๋‚˜?

๊ฐ€๋Šฅํ•˜์ง€๋งŒ, RTMP๊ฐ€ ์—ฌ์ „ํžˆย ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ ์ธ์ฝ”๋”(Ex) OBS Studio)๋“คย ์ค‘์—์„œ ๊ฐ€์žฅ ํ˜ธํ™˜๋˜๋Š” ์˜ต์…˜์ด๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ ํ›จ์”ฌย ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.ย 

+) RTMP๋กœ ๋น„๋””์˜ค ์ˆ˜์ง‘/์†ก์ถœ์„ ํ–ˆ์„ ๋•Œ์˜ ์žฅ์  ๐Ÿ‘‰๐Ÿปย ํด๋ฆญ

+) ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ ์ธ์ฝ”๋” ์ข…๋ฅ˜ ์‚ดํŽด๋ณด๊ธฐ ๐Ÿ‘‰๐Ÿปย ํด๋ฆญ




์ฐธ๊ณ  ์ž๋ฃŒ

Adobe RTMP Specification ยท RTMP

What is RTMP?

RTMP Streaming: The Real-Time Messaging Protocol Explained (Update)

RTMP and HTML5 Video Players - What Broadcasters Need to Know

What is RTMPS and Why is it Important to Secure Streaming?

What is RTMP Ingest? And How Significant is it to Live Streaming

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