{"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 &#8211; 12 bajt\u00f3w<\/li>\n<li>01 &#8211; 8 bajt\u00f3w<\/li>\n<li>10 &#8211; 4 bajty<\/li>\n<li>11 &#8211; 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) &#8211; wysy\u0142any co x odebranych bajt\u00f3w przez obie strony<\/li>\n<li>0x04 (Ping) &#8211; u\u017cywany do kontroli stanu strumienia, dzieli si\u0119 na podtypy<\/li>\n<li>0x05 (Server) &#8211; odpowiedzi serwera<\/li>\n<li>0x06 (Client) &#8211; zapytania klienta<\/li>\n<li>0x08 (Audio Data) &#8211; dane audio<\/li>\n<li>0x09 (Video Data) &#8211; dane video<\/li>\n<li>0x12 (Notify) &#8211; wywo\u0142anie nie oczekuj\u0105ce na odpowied\u017a<\/li>\n<li>0x13 (Shared Object) &#8211; obiekt wsp\u00f3\u0142dzielony, dzieli sie na podtypy<\/li>\n<li>0x14 (Invoke) &#8211; 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 &#8216;NetStream&#8217;, natomiast je\u015bli nadawc\u0105 jest serwer to zawieraj\u0105 obiekt &#8216;NetStream&#8217; 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 &#8216;handshake&#8217;. 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 &#8211; 8 bajt\u00f3w, liczba<\/li>\n<li>0x01 &#8211; 1 bajt, warto\u015b\u0107 boolean<\/li>\n<li>0x02 &#8211; string<\/li>\n<li>0x03 &#8211; 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 &#8211; film flash<\/li>\n<li>0x05 &#8211; 0 bajt\u00f3w, warto\u015b\u0107 NULL<\/li>\n<li>0x06 &#8211; 0 bajt\u00f3w, warto\u015b\u0107 niezdefioniowana<\/li>\n<li>0x07 &#8211; referencja<\/li>\n<li>0x08 &#8211; tablica ECMA<\/li>\n<li>0x09 &#8211; 0 bajt\u00f3w, koniec obiektu<\/li>\n<li>0x0a &#8211; stala tablica<\/li>\n<li>0x0b &#8211; data<\/li>\n<li>0x0c &#8211; string wielobajtowy<\/li>\n<li>0x0d &#8211; typ niewspierany<\/li>\n<li>0x0e &#8211; zbi\u00f3r rekord\u00f3w<\/li>\n<li>0x0f &#8211; obiekt XML<\/li>\n<li>0x10 &#8211; 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}]}}