{"id":77011,"date":"2020-04-07T01:42:55","date_gmt":"2020-04-06T23:42:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1"},"modified":"2021-02-16T09:44:41","modified_gmt":"2021-02-16T07:44:41","slug":"izuchaem-voip-dvizhok-mediastreamer2-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","title":{"rendered":"Zag\u0142\u0119biamy si\u0119 w silnik VoIP Mediastreamer2. Cz\u0119\u015b\u0107 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Materia\u0142 artyku\u0142u pochodzi z mojego <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">kana\u0142u Zen<\/a><\/noindex>.<\/p>\n<h2 id=\"vvedenie\">Wprowadzenie<\/h2>\n<p>Ten artyku\u0142 stanowi wprowadzenie do serii artyku\u0142\u00f3w na temat przetwarzania danych medi\u00f3w w czasie rzeczywistym przy u\u017cyciu silnika Mediastreamer2. W trakcie opisu b\u0119d\u0105 wykorzystywane minimalne umiej\u0119tno\u015bci w pracy w terminalu Linux oraz programowania w j\u0119zyku C.<\/p>\n<p>Mediastreamer2 to silnik VoIP, na kt\u00f3rym oparty jest popularny projekt open-source programu do telefonii VoIP. <noindex><a rel=\"nofollow\" href=\"http:\/\/linphone.org\/\">Linphone<\/a><\/noindex>. W Linphone Mediastreamer2 implementuje wszystkie funkcje zwi\u0105zane z d\u017awi\u0119kiem i wideo. Szczeg\u00f3\u0142ow\u0105 list\u0119 mo\u017cliwo\u015bci silnika mo\u017cna zobaczy\u0107 na tej stronie Mediastreamer. Kod \u017ar\u00f3d\u0142owy znajduje si\u0119 tutaj: <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.linphone.org\/BC\/public\/mediastreamer2\">GitLab<\/a><\/noindex>.<\/p>\n<p>W dalszej cz\u0119\u015bci tekstu, dla wygody, zamiast s\u0142owa Mediastreamer2 b\u0119dziemy u\u017cywa\u0107 jego polskiej notacji: \u201emidiastreamer\u201d.<\/p>\n<p>Historia jego powstania nie jest do ko\u0144ca jasna, ale s\u0105dz\u0105c po jego kodzie \u017ar\u00f3d\u0142owym, wcze\u015bniej korzysta\u0142 z biblioteki <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GLib\">Glib<\/a><\/noindex>, co sugeruje mo\u017cliwe dalekie pokrewie\u0144stwo z <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GStreamer\">GStreamer<\/a><\/noindex>. W por\u00f3wnaniu z nim mediastreamer wydaje si\u0119 bardziej lekki. Pierwsza wersja Linphone pojawi\u0142a si\u0119 w 2001 roku, wi\u0119c w tej chwili mediastreamer istnieje i rozwija si\u0119 od niemal 20 lat.<\/p>\n<p>Podstaw\u0105 mediastreamera jest architektura nazywana \u201eData flow\u201d (przep\u0142yw danych). Przyk\u0142ad takiej architektury przedstawiono na poni\u017cszym rysunku.<\/p>\n<p><img decoding=\"async\" alt=\"Zag\u0142\u0119biamy si\u0119 w silnik VoIP Mediastreamer2. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/2020\/04\/b05c34a9ee8c79fb39b439db32239071.jpg\" style=\"display:block;margin: 0 auto;\"><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>W tej architekturze algorytm przetwarzania danych jest okre\u015blany nie przez kod programistyczny, ale przez schemat (graf) po\u0142\u0105cze\u0144 funkcji, kt\u00f3re mo\u017cna uk\u0142ada\u0107 w dowolnej kolejno\u015bci. Te funkcje nazywane s\u0105 filtrami.<\/p>\n<p>Taka architektura umo\u017cliwia realizacj\u0119 funkcji przetwarzania medi\u00f3w w formie zestawu filtr\u00f3w po\u0142\u0105czonych w schem\u0119 przetwarzania i transmisji ruchu RTP telefonu VoIP.<\/p>\n<p>Mo\u017cliwo\u015b\u0107 \u0142\u0105czenia filtr\u00f3w w dowolne schemy, \u0142atwe opracowywanie nowych filtr\u00f3w, realizacja mediastreamera jako samodzielnej, odr\u0119bnej biblioteki, umo\u017cliwiaj\u0105 jego wykorzystanie r\u00f3wnie\u017c w innych projektach. Projekt mo\u017ce by\u0107 w obszarze VoIP, poniewa\u017c istnieje mo\u017cliwo\u015b\u0107 dodawania filtr\u00f3w wykonanych samodzielnie.<\/p>\n<p>Dostarczana domy\u015blnie biblioteka filtr\u00f3w jest wystarczaj\u0105co bogata i jak ju\u017c wspomniano, mo\u017ce by\u0107 rozszerzona o filtry stworzone we w\u0142asnym zakresie. Ale najpierw opiszemy gotowe filtry, kt\u00f3re s\u0105 dostarczane razem z mediastreamerem. Oto ich lista:<\/p>\n<h3 id=\"zvukovye-filtry\">Filtry d\u017awi\u0119kowe<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-zvuka\">Przechwytywanie i odtwarzanie d\u017awi\u0119ku<\/h4>\n<ul>\n<li>Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ<\/li>\n<li>D\u017awi\u0119k natywny Androida (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ<\/li>\n<li>Us\u0142uga kolejek audio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ<\/li>\n<li>Us\u0142uga jednostek audio (Mac OS X)<\/li>\n<li>Arts (Linux): MS_ARTS_WRITE, MS_ARTS_READ<\/li>\n<li>DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ<\/li>\n<li>Odtwarzacz plik\u00f3w (raw\/wav\/pcap) (Linux): MS_FILE_PLAYER<\/li>\n<li>Odtwarzacz plik\u00f3w (raw\/wav) (Windows): MS_WINSND_READ<\/li>\n<li>Nagrywanie do pliku (wav) (Linux): MS_FILE_REC<\/li>\n<li>Nagrywanie do pliku (wav) (Windows): MS_WINSND_WRITE<\/li>\n<li>Mac Audio Unit (Mac OS X)<\/li>\n<li>MME (Windows)<\/li>\n<li>OSS (Linux): MS_OSS_WRITE, MS_OSS_READ<\/li>\n<li>PortAudio (Mac OS X)<\/li>\n<li>PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ<\/li>\n<li>D\u017awi\u0119k w systemie Windows (Windows)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-zvuka\">Kodowanie\/dekodowanie d\u017awi\u0119ku<\/h4>\n<ul>\n<li>G.711 a-zakon: MS_ALAW_DEC, MS_ALAW_ENC<\/li>\n<li>G.711 \u00b5-zakon: MS_ULAW_DEC, MS_ULAW_ENC<\/li>\n<li>G.722: MS_G722_DEC, MS_G722_ENC<\/li>\n<li>G.726: MS_G726_32_ENC, MS_G726_24_ENC, MS_G726_16_ENC<\/li>\n<li>GSM: MS_GSM_DEC, MS_GSM_ENC<\/li>\n<li>Liniowa PCM: MS_L16_ENC, MS_L16_DEC<\/li>\n<li>Speex: MS_SPEEX_ENC, MS_SPEEX_DEC<\/li>\n<\/ul>\n<h4 id=\"obrabotka-zvuka\">Przetwarzanie d\u017awi\u0119ku<\/h4>\n<ul>\n<li>Adaptacja kana\u0142u (mono-&gt;stereo, stereo-&gt;mono): MS_CHANNEL_ADAPTER<\/li>\n<li>Konferencja: MS_CONF<\/li>\n<li>Generator DTMF: MS_DTMF_GEN<\/li>\n<li>T\u0142umienie echa (speex): MS_SPEEX_EC<\/li>\n<li>Equalizer: MS_EQUALIZER<\/li>\n<li>Mikser: MS_MIXER<\/li>\n<li>Kompensator utraty pakiet\u00f3w (PLC): MS_GENERIC_PLC<\/li>\n<li>Pr\u00f3bkowanie: MS_RESAMPLE<\/li>\n<li>Detektor ton\u00f3w: MS_TONE_DETECTOR<\/li>\n<li>Kontrola g\u0142o\u015bno\u015bci i pomiar poziomu sygna\u0142u: MS_VOLUME<\/li>\n<\/ul>\n<h3 id=\"filtry-video\">Filtry wideo<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-video\">Przechwytywanie i odtwarzanie wideo<\/h4>\n<ul>\n<li>Przechwytywanie Android<\/li>\n<li>Odtwarzanie Android<\/li>\n<li>Przechwytywanie AV Foundation (iOS)<\/li>\n<li>Odtwarzanie AV Foundation (iOS)<\/li>\n<li>Przechwytywanie DirectShow (Windows)<\/li>\n<li>Odtwarzanie DrawDib (Windows)<\/li>\n<li>Odtwarzanie zewn\u0119trzne \u2014 wysy\u0142anie wideo na najwy\u017cszy poziom<\/li>\n<li>Odtwarzanie GLX (Linux): MS_GLXVIDEO<\/li>\n<li>Mire \u2014 syntetyczny ruchomy obraz: MS_MIRE<\/li>\n<li>Odtwarzanie OpenGL (Mac OS X)<\/li>\n<li>Odtwarzanie OpenGL ES2 (Android)<\/li>\n<li>Przechwytywanie Quicktime (Mac OS X)<\/li>\n<li>Odtwarzanie SDL: MS_SDL_OUT<\/li>\n<li>Wyj\u015bcie statycznych obraz\u00f3w: MS_STATIC_IMAGE<\/li>\n<li>Video For Linux (V4L) przechwytywanie (Linux): MS_V4L<\/li>\n<li>Video For Linux 2 (V4L2) przechwytywanie (Linux): MS_V4L2_CAPTURE<\/li>\n<li>Video4windows (DirectShow) przechwytywanie (Windows)<\/li>\n<li>Video4windows (DirectShow) przechwytywanie (Windows CE)<\/li>\n<li>Video For Windows (vfw) przechwytywanie (Windows)<\/li>\n<li>XV odtwarzanie (Linux)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-video\">Kodowanie\/dekodowanie wideo<\/h4>\n<ul>\n<li>H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, Snow: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC<\/li>\n<li>H.264 (tylko dekoder): MS_H264_DEC<\/li>\n<li>Theora: MS_THEORA_ENC, MS_THEORA_DEC<\/li>\n<li>VP8: MS_VP8_ENC, MS_VP8_DEC<\/li>\n<\/ul>\n<h4 id=\"obrabotka-video\">Przetwarzanie wideo<\/h4>\n<ul>\n<li>Zrzut JPEG<\/li>\n<li>Konwerter formatu pikseli: MS_PIX_CONV<\/li>\n<li>Resizer<\/li>\n<li>Inne filtry<\/li>\n<li>Wymiana blok\u00f3w danych mi\u0119dzy w\u0105tkami: MS_ITC_SOURCE, MS_ITC_SINK<\/li>\n<li>Zbieranie blok\u00f3w danych z wielu wej\u015b\u0107 na jeden wyj\u015bcie: MS_JOIN<\/li>\n<li>RTP odbi\u00f3r\/nada\u017c: MS_RTP_SEND, MS_RTP_RECV<\/li>\n<li>Kopiowanie danych wej\u015bciowych na wiele wyj\u015b\u0107: MS_TEE<\/li>\n<li>Sp\u00f3jnym obci\u0105\u017ceniem: MS_VOID_SINK<\/li>\n<li>\u0179r\u00f3d\u0142o ciszy: MS_VOID_SOURCE<\/li>\n<\/ul>\n<h3 id=\"plaginy\">Wtyczki<\/h3>\n<h4 id=\"zvukovye-filtry-1\">Filtry d\u017awi\u0119kowe<\/h4>\n<ul>\n<li>Kodowanie\/dekodowanie AMR-NB<\/li>\n<li>Kodowanie\/dekodowanie G.729<\/li>\n<li>Kodowanie\/dekodowanie iLBC<\/li>\n<li>Kodowanie\/dekodowanie SILK<br \/>\n<h4 id=\"filtry-video\">Filtry wideo<\/h4>\n<\/li>\n<li>Programowy kodowany H.264<\/li>\n<li>H.264 V4L2 kodowanie\/dekodowanie z przyspieszeniem sprz\u0119towym<\/li>\n<\/ul>\n<p>Po kr\u00f3tkim opisie filtru jest podana nazwa typu, kt\u00f3ry jest u\u017cywany przy tworzeniu nowej instancji tego filtru. W dalszej cz\u0119\u015bci tekstu b\u0119dziemy si\u0119 odwo\u0142ywa\u0107 do tej listy.<\/p>\n<h2 id=\"ustanovka-pod-linux-ubuntu\">Instalacja na Linux Ubuntu<\/h2>\n<p>Teraz przeprowadzimy instalacj\u0119 mediastreamera na komputerze i stworzymy nasze pierwsze aplikacje z nim.<\/p>\n<p>Instalacja Mediastremer2 na komputerze lub maszynie wirtualnej z systemem Ubuntu nie wymaga specjalnych umiej\u0119tno\u015bci. Tutaj i dalej symbolem \u201e$\u201d b\u0119dziemy oznacza\u0107 zaproszenie pow\u0142oki shell do wprowadzania polece\u0144. Tzn. je\u015bli w wycinku widzisz ten symbol na pocz\u0105tku linii, oznacza to, \u017ce jest to linia z poleceniami do wykonania w terminalu.<\/p>\n<p>Zak\u0142ada si\u0119, \u017ce w trakcie wykonywania dzia\u0142a\u0144 opisanych w tym artykule, tw\u00f3j komputer ma dost\u0119p do Internetu.<\/p>\n<h4 id=\"ustanovka-paketa-libmediastremer-dev\">Instalacja pakietu libmediastremer-dev<\/h4>\n<p>Uruchamiamy terminal i wpisujemy polecenie:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get update<\/code><\/pre>\n<p>Zostanie poproszony o has\u0142o do wprowadzenia zmian, wprowad\u017a je, a mened\u017cer pakiet\u00f3w zaktualizuje swoje bazy. Po tym trzeba wykona\u0107:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install libmediastreamer-dev<\/code><\/pre>\n<p>Niezb\u0119dne pakiety zale\u017cno\u015bci i sama biblioteka mediastreamera zostan\u0105 automatycznie pobrane i zainstalowane.<\/p>\n<p>Ca\u0142kowity rozmiar pobranych pakiet\u00f3w deb zale\u017cno\u015bci wyniesie oko\u0142o 35 MB. Szczeg\u00f3\u0142y dotycz\u0105ce zainstalowanego pakietu mo\u017cna uzyska\u0107 za pomoc\u0105 polecenia:<\/p>\n<pre><code class=\"bash\">$ dpkg -s libmediastreamer-dev<\/code><\/pre>\n<p>Przyk\u0142ad odpowiedzi:<\/p>\n<pre><code class=\"bash\">Pakiet: libmediastreamer-dev\nStatus: zainstalowany prawid\u0142owo\nPriorytet: opcjonalny\nSekcja: libdevel\nZainstalowany rozmiar: 244\nUtrzymuj\u0105cy: Deweloperzy Ubuntu \nArchitektura: amd64\n\u0179r\u00f3d\u0142o: linphone\nWersja: 3.6.1-2.5\nZale\u017cy od: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev\nOpis: Biblioteka medi\u00f3w telefonu internetowego Linphone - pliki rozwojowe\nLinphone to internetowy telefon audio i wideo u\u017cywaj\u0105cy protoko\u0142u SIP. Posiada interfejs GTK+ i konsolowy, obejmuje du\u017c\u0105 r\u00f3\u017cnorodno\u015b\u0107 kodek\u00f3w audio i wideo oraz zapewnia funkcje IM.\n.\nTen pakiet zawiera biblioteki rozwojowe do obs\u0142ugi operacji multimedialnych.\nOryginalny utrzymuj\u0105cy: Zesp\u00f3\u0142 VoIP Debiana \nStrona domowa: http:\/\/www.linphone.org\/\n<\/code><\/pre>\n<h4 id=\"ustanovka-instrumentov-razrabotki\">Instalacja narz\u0119dzi deweloperskich<\/h4>\n<p>Instalujemy kompilator C i jego towarzysz\u0105ce narz\u0119dzia:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install gcc<\/code><\/pre>\n<p>Sprawdzamy wynik, pytaj\u0105c o wersj\u0119 kompilatora:<\/p>\n<pre><code class=\"bash\">$ gcc --version<\/code><\/pre>\n<p>Odpowied\u017a powinna wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<pre><code class=\"bash\">gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609\nCopyright (C) 2015 Free Software Foundation, Inc.\nTo jest oprogramowanie wolne; zobacz \u017ar\u00f3d\u0142o dotycz\u0105ce warunk\u00f3w kopiowania. Nie ma\n\u017cadnej gwarancji; nawet za JAKO\u015a\u0106 lub PRZYDATNO\u015a\u0106 DO KONKRETNEGO CELU.<\/code><\/pre>\n<h4 id=\"sborka-i-zapusk-probnogo-prilozheniya\">Kompilacja i uruchamianie pr\u00f3bnej aplikacji<\/h4>\n<p>Tworzymy w <em>home<\/em> folder dla naszych projekt\u00f3w edukacyjnych, nazwiemy go <em>mstutorial<\/em>:<\/p>\n<pre><code class=\"bash\">$ mkdir ~\/mstutorial<\/code><\/pre>\n<p>Skorzystaj z ulubionego edytora tekstu i stw\u00f3rz plik programu C o nazwie <em>mstest.c<\/em> o nast\u0119puj\u0105cej tre\u015bci:<\/p>\n<pre><code class=\"cpp\">#include \"stdio.h\"\n#include &lt;mediastreamer2\/mscommon.h&gt;\nint main()\n{\n  ms_init();\n  printf (\"Mediastreamer is ready.n\");\n}<\/code><\/pre>\n<p>Inicjalizuje mediator strumieniowy, wy\u015bwietla powitanie i ko\u0144czy dzia\u0142anie.<\/p>\n<p>Zapisujemy plik i kompilujemy aplikacj\u0119 testow\u0105 poleceniem:<\/p>\n<pre><code class=\"bash\">$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce wiersz<\/p>\n<pre><code class=\"bash\">`pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>jest uj\u0119ta w cudzys\u0142owy, kt\u00f3re znajduj\u0105 si\u0119 na klawiaturze w tym samym miejscu co litera \u201e\u0401\u201d.<\/p>\n<p>Je\u015bli plik nie zawiera b\u0142\u0119d\u00f3w, po kompilacji w katalogu pojawi si\u0119 plik <em>mstest<\/em>. Uruchamiamy program:<\/p>\n<pre><code class=\"bash\">$ .\/mstest<\/code><\/pre>\n<p>Wynik b\u0119dzie taki:<\/p>\n<pre><code class=\"bash\">ALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0\nALSA lib control.c:954:(snd_ctl_open_noupdate) Nieprawid\u0142owy CTL default:0\nortp-warning-Nie uda\u0142o si\u0119 pod\u0142\u0105czy\u0107 miksera do karty: Nieprawid\u0142owy argument\nALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Nieznany PCM default:0\nALSA lib conf.c:4738:(snd_config_expand) Nieznane parametry 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Nieznany PCM default:0\nortp-warning-Dziwne, karta d\u017awi\u0119kowa HDA Intel PCH wygl\u0105da na to, \u017ce nie jest w stanie niczego, ponowne pr\u00f3by z plughw...\nMediator strumieniowy jest gotowy.<\/code><\/pre>\n<p>W tym zleceniu widzimy komunikaty o b\u0142\u0119dach, kt\u00f3re generuje biblioteka ALSA, u\u017cywana do zarz\u0105dzania kart\u0105 d\u017awi\u0119kow\u0105. Sami tw\u00f3rcy mediatora strumieniowego uwa\u017caj\u0105, \u017ce to normalne. W tej sytuacji zmuszeni jeste\u015bmy si\u0119 z nimi zgodzi\u0107.<\/p>\n<p>Teraz mamy wszystko gotowe do pracy z mediatorem strumieniowym. Zainstalowali\u015bmy bibliotek\u0119 mediatora strumieniowego, narz\u0119dzie do kompilacji i za pomoc\u0105 pr\u00f3bnej aplikacji sprawdzili\u015bmy, \u017ce narz\u0119dzia s\u0105 skonfigurowane, a mediator strumieniowy jest poprawnie inicjalizowany.<\/p>\n<p>W nast\u0119pnej <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495728\/\">artyku\u0142<\/a><\/noindex> stworzymy aplikacj\u0119, kt\u00f3ra zbierze i uruchomi przetwarzanie sygna\u0142u d\u017awi\u0119kowego w \u0142a\u0144cuchu kilku filtr\u00f3w.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495702\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u0440\u0435\u0430\u043b\u0442\u0430\u0439\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0438\u0436\u043a\u0430 Mediastreamer2. \u0412 \u0445\u043e\u0434\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 Linux \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0421\u0438. Mediastreamer2 \u044d\u0442\u043e VoIP-\u0434\u0432\u0438\u0436\u043e\u043a, \u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e open-source \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e voip-\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 Linphone. \u0412 Linphone Mediastreamer2 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":77012,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-77011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0437\u0443\u0447\u0430\u0435\u043c VoIP-\u0434\u0432\u0438\u0436\u043e\u043a Mediastreamer2. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-06T23:42:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2021-02-16T07:44:41+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Poznajemy silnik VoIP Mediastreamer2. Cz\u0119\u015b\u0107 1 | ProHoster","description":"Materia\u0142 artyku\u0142u pochodzi z mojego kana\u0142u Dzen.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0437\u0443\u0447\u0430\u0435\u043c VoIP-\u0434\u0432\u0438\u0436\u043e\u043a Mediastreamer2. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0437\u044f\u0442 \u0441 \u043c\u043e\u0435\u0433\u043e \u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-06T23:42:55+00:00","article:modified_time":"2021-02-16T07:44:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"77011","title":null,"description":"","keywords":"","keyphrases":null,"primary_term":null,"canonical_url":"","og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:25:30","updated":"2022-09-28 05:33:38","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/77011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=77011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/77011\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/77012"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=77011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=77011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=77011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}