{"id":12,"date":"2008-08-11T12:35:32","date_gmt":"2008-08-11T10:35:32","guid":{"rendered":"http:\/\/touk.pl\/blog\/?p=12"},"modified":"2023-03-16T14:29:10","modified_gmt":"2023-03-16T13:29:10","slug":"rtmp-real-time-messaging-protocol","status":"publish","type":"post","link":"https:\/\/touk.pl\/blog\/2008\/08\/11\/rtmp-real-time-messaging-protocol\/","title":{"rendered":"RTMP &#8211; Real Time Messaging Protocol"},"content":{"rendered":"<p>Protok\u00f3\u0142 RTMP jest to zamkni\u0119ty standard przemys\u0142owy stworzony przez Adobe System.\u00a0Jest u\u017cywany do przesy\u0142ania obiekt\u00f3w AMF\u00a0 (Action Message Format)<strong> <\/strong>oraz danych w formie strumieniowej takich jaki audio i wideo pomiedzy klientem i serwerem Flash. RTMP do transportu wykorzustuje bezpo\u015brednio protok\u00f3\u0142 TCP\/IP na porcie 1935 tunel HTTP na porcie 80 (RTMPT). Mo\u017cliwe jest przesy\u0142anie do 64 strumieni jednocze\u015bnie po tym samym po\u0142aczeniu. W kazdym pakiecie AMF znajduje sie numer identyfikuj\u0105cy strumien. Dana pakiet RTMP mo\u017ce zawiera\u0107 wiele wiadmo\u015bci AMF.<\/p>\n<h2 id=\"pakiet-rtmp\">Pakiet RTMP<\/h2>\n<p>Pakiet rtmp sk\u0142ada si\u0119 z nag\u0142\u00f3wka o sta\u0142ej d\u0142ugo\u015bci oraz o zmiennej d\u0142ugo\u015bci zawarto\u015bci. D\u0142ugo\u015b\u0107 nag\u0142\u00f3wka mo\u017ce przyjmowa\u0107 cztery warto\u015bci:<\/p>\n<ul>\n<li>00 \u2013 12 bajt\u00f3w<\/li>\n<li>01 \u2013 8 bajt\u00f3w<\/li>\n<li>10 \u2013 4 bajty<\/li>\n<li>11 \u2013 1 bajt<\/li>\n<\/ul>\n<p>Kr\u00f3tsza d\u0142ugo\u015b\u0107 nag\u0142\u00f3wka oznacza ze brakujace dane s\u0105 takie same jak te wys\u0142ane w ostatnim pakiecie je zawieraj\u0105cym z tym samym object id.<\/p>\n<p>Pierwszy bajt zawiera informacje o d\u0142ugo\u015bci nag\u0142\u00f3wka oraz id obiektu. D\u0142ugo\u015b\u0107 nag\u0142\u00f3wka zawarta jest w pierwszych dw\u00f3ch bitach a id obiektu w kolejnych 6. Id obiektu wskazuje na id wiadomo\u015bci AMF powi\u0105zan\u0105 z danym strumieniem danych. Oznacza to ze mo\u017cliwe jest przes\u0142anie 64 typ\u00f3w obiekt\u00f3w czyli obs\u0142u\u017cenie 64 strumieni w tym samym po\u0142aczeniu.<\/p>\n<p>Kolejne trzy bajty zawieraj\u0105 timestamp, przesy\u0142any zawsze gdy d\u0142ugo\u015b\u0107 nag\u0142\u00f3wka jest wieksza\/r\u00f3wna 4 bajty. Jego zastosowanie i znaczenie nie jest znane:)<\/p>\n<p>Kolejne trzy bajty zawieraj\u0105 wielko\u015b\u0107 zawarto\u015bci pakietu RTMP (bez nag\u0142\u00f3wka), domy\u015blnie dla danych video oraz audio jest to 128 i 64 bajty. Nat\u0119puj\u0105cy bajt zawiera typ przkazywanego obiektu AMF.:<\/p>\n<ul>\n<li>0x03 (Bytes Read) \u2013 wysy\u0142any co x odebranych bajt\u00f3w przez obie strony<\/li>\n<li>0x04 (Ping) \u2013 u\u017cywany do kontroli stanu strumienia, dzieli si\u0119 na podtypy<\/li>\n<li>0x05 (Server) \u2013 odpowiedzi serwera<\/li>\n<li>0x06 (Client) \u2013 zapytania klienta<\/li>\n<li>0x08 (Audio Data) \u2013 dane audio<\/li>\n<li>0x09 (Video Data) \u2013 dane video<\/li>\n<li>0x12 (Notify) \u2013 wywo\u0142anie nie oczekuj\u0105ce na odpowied\u017a<\/li>\n<li>0x13 (Shared Object) \u2013 obiekt wsp\u00f3\u0142dzielony, dzieli sie na podtypy<\/li>\n<li>0x14 (Invoke) \u2013 wywo\u0142anie metody RPC na obiekcie zdalnym<\/li>\n<\/ul>\n<p>Ostatnie cztery bajty zawieraj\u0105 id strumienia. Je\u015bli nadawca pakietu jest klient to zawieraj\u0105 one obiekt \u017ar\u00f3d\u0142owy \u2018NetStream\u2019, natomiast je\u015bli nadawc\u0105 jest serwer to zawieraj\u0105 obiekt \u2018NetStream\u2019 przypisany do tego strumienia po stronie serwera.<\/p>\n<h2 id=\"polaczenie-handshake\">Po\u0142aczenie (Handshake)<\/h2>\n<p>Ka\u017cde po\u0142aczenie inicjowane jest przez klienta. Inicjalizacja ma miejsce w oparciu o tzw \u2018handshake\u2019. Klient wysy\u0142a do serwera pojedy\u0144czy bajt o warto\u015bci 0x03 i tablic\u0119 bajt\u00f3w o d\u0142ugo\u015bci 1536 oraz zapami\u0119tuje zawarto\u015b\u0107 tablicy. Serwer w odpowiedzi wysy\u0142a pojedy\u0144czy bajt o warto\u015b\u0107i 0x03 oraz dwie tablice bajt\u00f3w o d\u0142ugo\u015bci 1536.\u00a0 Zawarto\u015b\u0107 drugiej tablicy jest kopi\u0105 pierwszej tablicy wys\u0142anej przez klienta. Klient por\u00f3wnuje zawarto\u015bci tablicy i je\u015bli s\u0105 zgodne wysy\u0142a do serwera ostateczne potwierdzenie w postaci pojedy\u0144czego bajtu i tablicy bajt\u00f3w o d\u0142ugo\u015bci 1536 bed\u0105cej kopi\u0105 pierwszej tablicy otrzymanej w odpowiedzi od serwera. Od tej pory po\u0142aczenie jest nawi\u0105zane.<\/p>\n<h2 id=\"obiekty-amf\">Obiekty AMF<\/h2>\n<p>Po nawi\u0105zaniu po\u0142aczenia dane audio jak i video s\u0105 przesy\u0142ane w obiektach u\u017cywaj\u0105cych struktury AMF. Format AMF jest wykorzystywany do przenoszenia klas LocalConnection, SharedObject, NetConnection, and NetStream. Wszystkie obiekty AMF s\u0105 poprzedzone jedno bajtowym nag\u0142\u00f3wkiem lub nag\u0142\u00f3wkiem zgodnym z opakowuj\u0105cym nag\u0142\u00f3wkiem RTMP. Pierwsze bajt wskazuje na typ obiektu, zanczenie kolejnych bajt\u00f3w zale\u017cy bezpo\u015brednio od typu obiektu:<\/p>\n<ul>\n<li>0x00 \u2013 8 bajt\u00f3w, liczba<\/li>\n<li>0x01 \u2013 1 bajt, warto\u015b\u0107 boolean<\/li>\n<li>0x02 \u2013 string<\/li>\n<li>0x03 \u2013 obiekt, jest to lista par typu klucz\/warto\u015b\u0107. Klucz jest reprezentowany jako String a warto\u015b\u0107 to obiekt AMF. Koniec obiektu jest wskazany za pomoc\u0105 0x000009 (par\u0119 o zerowej d\u0142ugo\u015bci kluczu i warto\u015bci ko\u0144ca obiektu)<\/li>\n<li>0x04 \u2013 film flash<\/li>\n<li>0x05 \u2013 0 bajt\u00f3w, warto\u015b\u0107 NULL<\/li>\n<li>0x06 \u2013 0 bajt\u00f3w, warto\u015b\u0107 niezdefioniowana<\/li>\n<li>0x07 \u2013 referencja<\/li>\n<li>0x08 \u2013 tablica ECMA<\/li>\n<li>0x09 \u2013 0 bajt\u00f3w, koniec obiektu<\/li>\n<li>0x0a \u2013 stala tablica<\/li>\n<li>0x0b \u2013 data<\/li>\n<li>0x0c \u2013 string wielobajtowy<\/li>\n<li>0x0d \u2013 typ niewspierany<\/li>\n<li>0x0e \u2013 zbi\u00f3r rekord\u00f3w<\/li>\n<li>0x0f \u2013 obiekt XML<\/li>\n<li>0x10 \u2013 obiekt typowany<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Protok\u00f3\u0142 RTMP jest to zamkni\u0119ty standard przemys\u0142owy stworzony przez Adobe System.\u00a0Jest u\u017cywany do przesy\u0142ania obiekt\u00f3w AMF\u00a0 (Action Message&hellip;\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":{"0":"post-12","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-development-design"},"_links":{"self":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":8,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/12\/revisions"}],"predecessor-version":[{"id":15289,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/posts\/12\/revisions\/15289"}],"wp:attachment":[{"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/media?parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/categories?post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/touk.pl\/blog\/wp-json\/wp\/v2\/tags?post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}