
RTMP๋ Real-Time Messaging Protocol์ ์ฝ์์ด๋ฉฐ, ๋ผ์ด๋ธ ์จ๋ผ์ธ ๋น๋์ค ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ ๋ฐ์ดํฐ ์ ์ก ๊ธฐ์ ์ด๋ค. Adobe์ ๋ฐ๋ฅด๋ฉด, RTMP๋ ์ ์ ํ ์ ์ก ํ๋กํ ์ฝ(Ex) TCP)์ ํตํด ๋ฉํฐ๋ฏธ๋์ด ์ ์ก ์คํธ๋ฆผ(Ex) ์ค๋์ค, ๋น๋์ค ๋ฐ ๋ํํ ์ฝํ ์ธ )์ ๋ฉํฐํ๋ ์ฑ ๋ฐ ํจํทํํ๋๋ก ์ค๊ณ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค ํ๋กํ ์ฝ์ด๋ผ๊ณ ํ๋ค.
Audio Codecs :ย AAC, AAC-LC, HE-AAC+ v1 & v2, MP3, Speex
Video Codecs :ย H.264, VP8, VP6, Sorenson Sparkยฎ, Screen Video v1 & v2
+) ์ค๋์ค์ ๋น๋์ค ์ฝ๋ฑ์ ๋ํด ๋ ์๊ณ ์ถ๋ค๋ฉด? ๐๐ปย ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ ์ ํฉํ ์ค๋์ค ์ฝ๋ฑ, ๋น๋์ค ์ฝ๋ฑ์ ๋ํด
+) ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด? ๐๐ปย 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

์ด์ RTMP๋ ๋น๋์ค ์์ง(video ingestion)์ ์ฌ์ฉ๋๋ค. ์ํํธ์จ์ด ์ธ์ฝ๋์์ ์ค์์ฒ, ๋น๋์ค ํ๋ ์ด์ด, ์๋ฒ๋ก ๋น๋์ค ํ์ผ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฉ์ก ์์ค(์นด๋ฉ๋ผ๋ ์บก์ฒ ์นด๋ ๋ฑ)๋ฅผ ์ธ์ฝ๋์์ RTMP๋ก ์ ์กํ ํ, ์ ํ๋ธ๋ ํธ์์น์ ๊ฐ์ ์๋น์ค์์ ์ด๋ฅผ ๋ค์ HLS๋ก ๋ณํํ์ฌ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๋ฐฉ์์ธ ๊ฒ์ด๋ค. (๊ทธ๋์ ๋น๋์ค ์์ง์ RTMP, ์ฌ์ฉ์์๊ฒ ์ ์กํ๋ ๊ฒ์ HLS. ๊ฐ์ ํํ๊ฐ ์์ฃผ ๋ณด์ด๋ ๊ฒ) ์ด๋ ๊ฒ RTMP๋ ์ธ์ฝ๋์ ํ๋ซํผ ๊ฐ ์ฐ๊ฒฐ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
HLS๊ฐ์ ํ๋กํ ์ฝ์ด ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ ์ ๋ฌ์ ๋์ ๋จ์ ๋ฐ๋ผ ์คํธ๋ฆฌ๋ฐ ๋ฏธ๋์ด ์๋ฒ๋ ๋ณํํ๋ ํ๊ฒฝ์ ์ฒ๋ฆฌํ๋๋ก ์กฐ์ ๋์๋ค. RTMP๋ First-mile(์์์ ๋งํ 1๋จ๊ณ)์์ ๋ฏธ๋์ด ์๋ฒ์ ์ํด ์ฌ์ ํ ์์ง๋์์ง๋ง ํ์์ ๋ฐ๋ผ ํ๋ ์ด์ด์ ํ์์ ๋ง๋ ํ๋กํ ์ฝ๋ก ๋ณํํ ํ์ํ๊ฒ ๋๋ค. RTMP๋ ์ฌ์ ํ ๋ง์ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ๋ค์ด ์ฌ์ฉํ๊ณ ์์ง๋ง SRT์ WebRTC์ ๊ฐ์ ๋ค๋ฅธ ํ๋กํ ์ฝ๋ค์ด ์ฃผ๋ชฉ๋ฐ๊ณ ์์ด ์ง์ผ๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
์ค๋์ค ๋ฐ ๋น๋์ค ์ฝํ ์ธ ๋ฅผ ์บก์ฒ ๋ฐ ์ธ์ฝ๋ฉํ๊ณ , RTMP ์๋ฒ์์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ , ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐ์ ์ํด ์๋ฒ๋ก ๋ณด๋ด๋ ํ๋ก์ธ์ค์ด๋ค. RTMP ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ ์์์ ์ดฌ์ํ๋ ์นด๋ฉ๋ผ/์ธ์ฝ๋์์ ์จ๋ผ์ธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. ๋ฐฉ์ก์ฌ์ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์์ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ฝ๋, ์นด๋ฉ๋ผ ๋ฐ ๊ธฐํ ์์ค๋ก๋ถํฐ ๋ผ์ด๋ธ ๋น๋์ค ํผ๋๋ฅผ ์์ ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ ์๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
RTMP ์๋ฒ์์ ํธ๋์ค์ฝ๋ฉ๋ ์ค๋์ค ๋ฐ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋์ด ํ๋ ์ด์ด ๋๋ ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ํ๋ ์ด์์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ํ๋ธ๋ค. HLS ๋๋ DASH์ ๊ฐ์ ๋ค๋ฅธ ํธํ ๊ฐ๋ฅํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์๋ค.
์์ ํธํ์ฑ ์ฃผ์ ์์๋ ๋งํ์ง๋ง RTMP ์คํธ๋ฆฌ๋ฐ์ Flash ๋น๋์ค ํ๋ ์ด์ด์ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋์์๊ณ , ๋ชจ๋ฐ์ผ ์คํธ๋ฆฌ๋ฐ ๋ฏธ์ง์, ์ง์์ ๋๊น ๋ฑ๋ฑ ๋๋ฌธ์ ์ ์ฌ์ฉํ์ง ์๋ ์ถ์ธ์ด๋ค. ์ด์ ์ ๊ณ์์๋ ๊ธฐ์กด ์น ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ HTTP ๊ธฐ๋ฐ ํ๋กํ ์ฝ(Ex) HLS)์ ์ ํธํ๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ์๋ฒ๊ฐ ์คํธ๋ฆฌ๋ฐ ์ฝํ ์ธ ๋ฅผ ์บ์ํ ์ ์์ผ๋ฏ๋ก ํ์ฅ์ฑ๊ณผ ์์ฒญ ๊ฒฝํ์ด ํฅ์๋๋ค. ๋ฐ๋ผ์ ABR ๋ฐฉ์์ด ๋์ฑ ๋ณดํธํ๋์ด์ก๊ณ , ๋ฐฉ์ก์ฌ๊ฐ ์์ฒญ์์ ๊ธฐ๊ธฐ ๋ฐ ์ฐ๊ฒฐ์ ๋ง์ถฐ ์ฝํ ์ธ ๋ฅผ ์ต์ ํํ ์ ์๊ฒ ๋์๋ค๊ณ ํ๋ค.
์ด ๊ณผ์ ์ ํฌ๊ฒ Handshake, Connect, Stream 3๋จ๊ณ๋ก ๋๋๋ค.
๋จผ์ , RTMP ์ฐ๊ฒฐ์ Handshake๋ก ์์ํ๋ค. RTMP๋ TCP ์์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ three-way handshake๋ฅผ ์ฌ์ฉํ๋ค.

C0~2, S0~2๋ ๋ชจ๋ ์ ์ ํฌ๊ธฐ chunk์ด๋ค.

version : C0 ํจํท์์ ์ด ํ๋๋ ์คํธ๋ฆฌ๋ฐ๋๋ RTMP ํ๋กํ ์ฝ ๋ฒ์ ์ ์๋ฒ์ ์๋ ค์ฃผ๋ ๊ฒ์ด๊ณ , S0์์ ์ด ํ๋๋ ์๋ฒ์์ ์ ํํ RTMP ๋ฒ์ ์ ์๋ณํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ๋ฒ์ ์ ์ฃผ๋ก 3์ ์ฌ์ฉํ๋ค. ๋ง์ฝ, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฒ์ ์ ์ธ์ํ์ง ๋ชปํ๋ ์๋ฒ๋ 3์ผ๋ก ์๋ตํด์ผ๋ง ํ๋ค.
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์ ๊ฒฝ์ฐ C1time2 : ์๋๋ฐฉ์ด ๋ณด๋ธ ์ด์ ํจํท(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๊ฐ ์๋ฃ๋์๋ค! ์ด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฉ์์ง๋ฅผ ๊ตํํ ์ ์๋ค.
์ฐ๊ฒฐ ๋จ๊ณ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ AMF(Action Message Format) ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.(ํ๋ ์ด์์ Chunk Stream์ ๋ฉํฐํ๋ ์ฑ) ํด๋ผ์ด์ธํธ๋ ๋ฉ์์ง์ ์ฐ๊ฒฐ URL, ์ค๋์ค ์ฝ๋ฑ, ๋น๋์ค ์ฝ๋ฑ๊ณผ ๊ฐ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ํ๊ณ , Set Peer Bandwidth , Window Acknowledgement Size ์ ๋ํ ๋ฉ์์ง๋ ๊ตํํ๋ค. ์๋ฒ๊ฐ ๋จผ์ ์๋ตํ์ฌ ์ฐ๊ฒฐ์ด ๋ชจ๋ ์ค์ ๋๋ฉด ์๋ฒ๊ฐ ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์ ์๊ฒ ๋๋ค.
Handshake ๋ฐ Connect ๋จ๊ณ๋ฅผ ์๋ฃํ์ผ๋ฏ๋ก ์ด์ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค. ๋ํ, createStream, play, receiveAudio, seek, pause ๋ฑ๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋น๋์ค๊ฐ ์ง์์ ๋ฐ๋ผ ์ ์ก๋๋๋ก ํ ์ ์๋ค.
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๋ ์ฌ๋ฌ ์คํธ๋ฆผ์ ๊ฑธ์ณ ๋ชจ๋ ๋ฉ์์ง์ ํ์์คํฌํ ์์์ ๋ฐ๋ผ ์๋ํฌ์๋๋ก ์ ๋ฌ๋๋ค.
Chunk Stream : ํ ๋ฐฉํฅ์ผ๋ก๋ง(ํด๋ผ์ด์ธํธ โ ์๋ฒ, ์๋ฒ โ ํด๋ผ์ด์ธํธ) ์ฒญํฌ๋ค์ด ํ๋ฅด๋ ๋
ผ๋ฆฌ์ ํต๋ก
Chunk Stream ID : ๊ฐ ์ฒญํฌ๊ฐ ์ด๋ Chunk Stream์ ์ํด ์๋์ง ์๋ณํ ์ ์๋ ์๋ณ ๋ฒํธ.
Multiplexing : ๊ฐ๋ณ ์ค๋์ค/๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ํ๋์ ํตํฉ๋ ์คํธ๋ฆผ์ผ๋ก ๋ง๋ค์ด ์ฌ๋ฌ ๋น๋์ค์ ์ค๋์ค๋ฅผ ๋์์ ์ ์กํ ์ ์๋๋ก ํ๋ ํ๋ก์ธ์ค. Ex) ์์๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๋ก ๋ณด๋ด์ง ์๊ณ , ํ๋์ ์คํธ๋ฆผ์ผ๋ก ๋ง๋ค์ด ์ ์กํ๋ ๊ฒ
DeMultiplexing : ๋ฉํฐํ๋ ์ฑ์ ๋ฐ๋ ๊ณผ์ ์ผ๋ก, ํ๋๋ก ํฉ์ณ์ง ์ค๋์ค/๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฆฌํ์ฌ ์๋์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ก ๋ณต์ํ๋ ๊ณผ์ ์ด๋ค.
RPC : ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ์๋ก ์๊ฒฉ์์ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ ์์ฒญ์ด๋ค. Ex) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์๋ ํน์ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ ๋ฐฉ์
Metadata : ๋ฐ์ดํฐ์ ๋ํ ์ค๋ช
Application Instance : ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ์์ฒญํ๋ ์๋ฒ์ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํ ์ธ์คํด์ค๋ฅผ ๋งํ๋ค. ๊ฐ ํด๋ผ์ด์ธํธ๋ ํน์ ์์ฉ ํ๋ก๊ทธ๋จ ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋์ด ํต์ ์ ํ๋ค.
AMF : AMF๋ ActionScript ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ(์ปดํจํฐ์์ ์ฝ๊ฒ ์ ์กํ๊ณ ์ ์ฅํ ์ ์๋ ํํ๋ก ๋ณํ)ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด์ง ํ์์ด๋ค. AMF 0๊ณผ AMF 3 ๋ ๊ฐ์ง ๋ฒ์ ์ด ์๋ค.
RTMP๋ ์์, ์์ฑ, ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ์กํ๊ณ , ๊ฐ ๋ฉ์์ง ์ ํ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ ํ๋กํ ์ฝ์ด๋ค.
RTMP ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ ์ฌ์ฉํ๋ ์ ์ก ๋ฐฉ์์ผ๋ก, ๊ฐ ์ฒญํฌ ์คํธ๋ฆผ์ ํ๋์ ๋ฉ์์ง ์คํธ๋ฆผ์์ ํ ๊ฐ์ง ์ ํ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์๋ค. ์ฌ๊ธฐ์๋ Connection ๊ด๋ฆฌ ๋ฉ์์ง, Stream ์์ฑ/์ ์ด ๋ฉ์์ง, ์ค์ ๋ฏธ๋์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ฉฐ Chunk Stream์ ํตํด Connection, Stream์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
์ฒญํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์์ค ํ๋กํ ์ฝ์ ํฐ ๋ฉ์์ง๋ฅผ ๋ ์์ ๋ฉ์์ง๋ก ๋๋ ์ ์๋ค. ์์ฑ๋ ๊ฐ ์ฒญํฌ์๋ Chunk Stream ID๋ผ๋ ์๋ณ์๊ฐ ์๋๋ฐ, ์ด ์๋ณ์๋ก ์์ ์ ์ธก์์ ๋ฉ์์ง๋ก ์กฐ๋ฆฝ๋๋ค. ์ฒญํฌ ํฌ๊ธฐ๊ฐ ํด์๋ก CPU ์ฌ์ฉ๋์ด ์ค์ด๋ค์ง๋ง, ์ฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ค ๋์ญํญ์ด ๋ฎ์ ์ฐ๊ฒฐ์์ ๋ค๋ฅธ ์ฝํ ์ธ ๋ฅผ ์ง์ฐ์ํฌ ์ ์๋ค. ๋ํ, ๋๋ฌด ์์ ์ฒญํฌ๋ ๋์ ๋นํธ ์ ์ก๋ฅ ์คํธ๋ฆฌ๋ฐ์ ์ ํฉํ์ง ์๋ค.

๊ฐ ์ฒญํฌ๋ ํค๋์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ํค๋ ์์ฒด๋ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
Basic Header
Message HeaderBasic Header ์ fmt ๊ฐ์ ๋ฐ๋ผ 0, 3, 7, 11 byte์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๋ค.
์ ์ก ์ค์ธ ๋ฉ์์ง์ ๋ํ ์ ๋ณด(์ ์ฒด ๋๋ ์ผ๋ถ)๋ฅผ ์ธ์ฝ๋ฉ
๊ณตํต ํค๋ ํ๋
์ ํ 0

์ ํ 1

์ ํ 2

Extended TimestampChunk DataRTMP๋ ์๋ RTMP ์ฒญํฌ ์คํธ๋ฆผ๊ณผ ํจ๊ป ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ง๋ง ๋ค๋ฅธ ์ ์ก ํ๋กํ ์ฝ(Ex) TCP/IP, WebSocket ๋ฑ)์ ์ฌ์ฉํด์ RTMP Message๋ฅผ ๋ณด๋ผ ์ ์๋ค. ์ด RTMP Message๋ ํค๋์ ํ์ด๋ก๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ค๋์ค, ๋น๋์ค, ๋ฐ์ดํฐ ๋๋ ๊ธฐํ ๋ฉ์์ง๊ฐ ํฌํจ๋ ์ ์๋ค. ๋ฉ์์ง ์ ํ์ผ๋ก๋ ์ค๋์ค ๋ฉ์์ง, ๋น๋์ค ๋ฉ์์ง, ๋ช ๋ น ๋ฉ์์ง, ๊ณต์ ๊ฐ์ฒด ๋ฉ์์ง, ๋ฐ์ดํฐ ๋ฉ์์ง ๋ฐ ์ฌ์ฉ์ ์ ์ด ๋ฉ์์ง๊ฐ ์๋ค.
Message Header

Message Payload
RTMP์ HLS๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋๊ธฐ ์๊ฐ์ ๋๋ฌด ๋์ด์ง ์๊ณ ๋ ํธํ์ฑ์ ๊ทน๋ํํ ์ ์๋ค. ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
1. RTMP๋ก ์ก์ถ
์คํธ๋ฆฌ๋จธ๋ OBS(์คํ ๋ธ๋ก๋์บ์คํฐ ์ํํธ์จ์ด) ๋๋ XSplit๊ณผ ๊ฐ์ ์ธ์ฝ๋ฉ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ RTMP ํ๋กํ ์ฝ์ ํตํด ์คํธ๋ฆฌ๋ฐ ์๋ฒ๋ก ์คํธ๋ฆผ์ ๋ณด๋ธ๋ค.
2. ํธ๋์ค์ฝ๋ฉ ๋ฐ ํ๋กํ ์ฝ ๋ณํ
์คํธ๋ฆฌ๋ฐ ์๋ฒ๋ ์์ ๋ RTMP ์คํธ๋ฆผ์ ๋ฐ์์ ํธ๋์ค์ฝ๋ฉ์ ์งํํ๋ค. ํธ๋์ค์ฝ๋ฉ์ ์๋ณธ ์คํธ๋ฆผ์ ๋ค์ํ ํด์๋(720p, 1080p ๋ฑ)์ ๋นํธ๋ ์ดํธ๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค. ์ด๋ฅผ ํตํด ์์ฒญ์์ ๋คํธ์ํฌ ์ํ์ ๋ง์ถฐ ์ ์ํ ์คํธ๋ฆฌ๋ฐ์ ์ ๊ณตํ ์ ์๊ฒ ๋๋ค. ์ด ๊ณผ์ ์์ RTMP ํ๋กํ ์ฝ๋ก ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ HLS ํ๋กํ ์ฝ์ ๋ง๊ฒ ๋ณํํ๋ค.
3. HLS ์คํธ๋ฆฌ๋ฐ
๋ณํ๋ HLS ์คํธ๋ฆผ์ ์คํธ๋ฆฌ๋ฐ ์๋ฒ์์ ์์ฒญ์์๊ฒ ์ ๊ณต๋๋ค. HLS๋ ์ฒญํฌ ๋จ์๋ก ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฏ๋ก ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ์์ฒญ์์ ์ฌ์ ํ๊ฒฝ์ ๋ง๋ ํ์ง๋ก ์ค์๊ฐ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค.
4. ์์ฒญ์๋ HLS๋ก ์คํธ๋ฆผ ์ฌ์
์์ฒญ์๋ HLS ํ๋กํ ์ฝ์ ํตํด ๋น๋์ค๋ฅผ ์คํธ๋ฆฌ๋ฐ ๋ฐ๋๋ค. ๋น๋์ค ํ๋ ์ด์ด๋ ์๋ฒ์์ ์ ๊ณตํ๋ M3U8 ํ์ผ(๋น๋์ค ์ฒญํฌ ๋ชฉ๋ก)์ ์ฝ์ด ์์, ๋คํธ์ํฌ ์ํ์ ๋ฐ๋ผ ์ ์ ํ ๋นํธ๋ ์ดํธ๋ฅผ ์ ํํด ์ฌ์ํ๋ค.
์ฐ์ ํ์ํ์ ํ๋กํ ์ฝ์ด ๊ฐ์ ธ์ผํ๋ ์ค์ํ ์ ์ด ๋ฌด์์ธ์ง๋ฅผ ์์์ผ ํ๋ค.
์ด๋ฌํ ์ ๋ค์ ๊ฐ์ง๋ ํ๋กํ ์ฝ๋ก๋ WebRTC ํ๋กํ ์ฝ์ด ์ ํฉํ๋ค. WebRTC๋ ํผ์ด ํฌ ํผ์ด(P2P) ๋ฐฉ์์ผ๋ก ์๋ํด ์ค๊ฐ ์๋ฒ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์ง์ ์ฐ๊ฒฐ๋๋ฏ๋ก, ์์ ๋ฐ ์์ฑ ๋ฐ์ดํฐ๊ฐ ๋น ๋ฅด๊ฒ ์ ๋ฌ๋๋ค. ๋ํ, ๋ณ๋์ ํ๋ฌ๊ทธ์ธ ์ค์น ์์ด๋ ๋๋ถ๋ถ์ ์ต์ ์น ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋๋ฏ๋ก ์ฌ์ฉ์๋ ์์ฝ๊ฒ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ํ์ํ์์ ์ฐธ์ฌํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด RTMP๋ ๋ถ๊ฐ๋ฅํ๊ฐ? ๐ค ๋ถ๊ฐ๋ฅ์ด๋ผ๊ธฐ ๋ณด๋ค ๋ถ์ ํฉํ๋ค๋ ๊ฒ์ด ๋ง๋ ๊ฒ ๊ฐ๋ค. RTMP๋ ์ฃผ๋ก ์คํธ๋ฆฌ๋ฐ ์๋น์ค์ ์ฌ์ฉ๋๋ฉฐ, ๋ฐฉ์ก ์ก์ถ ์ ์ผ์ ํ ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ ์ ๋ฐ์ ์๋ค. ๋ฐ๋ผ์ ์ค์๊ฐ์ผ๋ก ์ํธ์์ฉ์ด ์ค์ํ ํ์ํ์์๋ ์ ํฉํ์ง ์๋ค. ๋ํ, RTMP๋ ์๋ฒ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ์ฐธ๊ฐ์ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์๋ฒ ๋ถ๋ด์ด ์ฆ๊ฐ๋๋ค.
๊ฐ๋ฅํ์ง๋ง, RTMP๊ฐ ์ฌ์ ํย ๋ผ์ด๋ธ ์คํธ๋ฆผ ์ธ์ฝ๋(Ex) OBS Studio)๋คย ์ค์์ ๊ฐ์ฅ ํธํ๋๋ ์ต์ ์ด๋ค. ๋ ๋ค๋ฅธ ์ด์ ์ ํจ์ฌย ์งง์ ๋๊ธฐ ์๊ฐ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ ์ ์๋ค๋ ๊ฒ์ด๋ค.ย
+) RTMP๋ก ๋น๋์ค ์์ง/์ก์ถ์ ํ์ ๋์ ์ฅ์ ๐๐ปย ํด๋ฆญ
+) ๋ผ์ด๋ธ ์คํธ๋ฆผ ์ธ์ฝ๋ ์ข ๋ฅ ์ดํด๋ณด๊ธฐ ๐๐ปย ํด๋ฆญ
Adobe RTMP Specification ยท 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