{"id":87067,"date":"2020-07-03T07:42:03","date_gmt":"2020-07-03T05:42:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2"},"modified":"2020-07-03T07:42:03","modified_gmt":"2020-07-03T05:42:03","slug":"izuchaem-voip-dvizhok-mediastreamer2-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","title":{"rendered":"Studujeme VoIP engine Mediastreamer2. \u010c\u00e1st 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Materi\u00e1l \u010dl\u00e1nku je p\u0159evzat z m\u00e9ho <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">zenov\u00e9ho kan\u00e1lu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Studujeme VoIP engine Mediastreamer2. \u010c\u00e1st 2\" src=\"\/wp-content\/uploads\/2020\/07\/1afc1603a438f865c56bba72012d591e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"sozdaem-tonalnyy-generator\">Vytv\u00e1\u0159\u00edme t\u00f3nov\u00fd gener\u00e1tor<\/h2>\n<p><\/p>\n<p>V p\u0159edchoz\u00edm <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495702\/\">\u010dl\u00e1nku<\/a><\/noindex> Nainstalovali jsme knihovnu mediastreameru, v\u00fdvojov\u00e9 n\u00e1stroje a ov\u011b\u0159ili jejich funk\u010dnost, sestavili jsme zku\u0161ebn\u00ed aplikaci.<\/p>\n<p><\/p>\n<p>Dnes vytvo\u0159\u00edme aplikaci, kter\u00e1 bude schopna generovat t\u00f3nov\u00fd sign\u00e1l na zvukov\u00e9 kart\u011b. K vy\u0159e\u0161en\u00ed tohoto \u00fakolu pot\u0159ebujeme propojit filtry podle sch\u00e9matu zvukov\u00e9ho gener\u00e1toru uveden\u00e9ho n\u00ed\u017ee:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Studujeme VoIP engine Mediastreamer2. \u010c\u00e1st 2\" src=\"\/wp-content\/uploads\/2020\/07\/249759aec6235d3285e6ba6c28524710.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Sch\u00e9ma \u010dteme zleva doprava, pr\u00e1v\u011b t\u00edmto sm\u011brem se pohybuje datov\u00fd tok. \u0160ipky n\u00e1m to tak\u00e9 nazna\u010duj\u00ed. Obd\u00e9ln\u00edky ozna\u010duj\u00ed filtry, kter\u00e9 zpracov\u00e1vaj\u00ed bloky dat a poskytuj\u00ed v\u00fdstup. Uvnit\u0159 obd\u00e9ln\u00edku je uvedena jeho role a kousek n\u00ed\u017ee velk\u00fdmi p\u00edsmeny typ filtru. \u0160ipky spojuj\u00edc\u00ed obd\u00e9ln\u00edky jsou fronty dat, po nich\u017e jsou bloky dat doru\u010dov\u00e1ny z filtru do filtru. V obecn\u00e9m p\u0159\u00edpad\u011b m\u016f\u017ee m\u00edt filtr mnoho vstup\u016f a v\u00fdstup\u016f.<\/p>\n<p><\/p>\n<p>V\u0161e za\u010d\u00edn\u00e1 zdrojem takt\u016f, kter\u00fd ur\u010duje tempo, jak\u00fdm prob\u00edh\u00e1 zpracov\u00e1n\u00ed dat ve filtrech. Na jeho takt ka\u017ed\u00fd filtr zpracov\u00e1v\u00e1 v\u0161echny bloky dat, kter\u00e9 m\u00e1 na vstupu. A poskytuje bloky s v\u00fdsledkem na v\u00fdstup \u2014 do fronty. Nejprve zpracov\u00e1v\u00e1 nejbli\u017e\u0161\u00ed filtr ke zdroji takt\u016f, pot\u00e9 filtry p\u0159ipojen\u00e9 k jeho v\u00fdstup\u016fm (m\u016f\u017ee jich b\u00fdt mnoho) a tak d\u00e1le. Jakmile posledn\u00ed filtr v \u0159et\u011bzci dokon\u010d\u00ed zpracov\u00e1n\u00ed, b\u011bh se zastav\u00ed, dokud nep\u0159ijde nov\u00fd takt. Takty obvykle n\u00e1sleduj\u00ed s intervalem 10 milisekund. <\/p>\n<p><\/p>\n<p>Vra\u0165me se k na\u0161emu sch\u00e9matu. Takty p\u0159ich\u00e1zej\u00ed na vstup zdroje ticha, co\u017e je filtr, kter\u00fd vytv\u00e1\u0159\u00ed na sv\u00e9m v\u00fdstupu v ka\u017ed\u00e9m taktu blok dat obsahuj\u00edc\u00ed nuly. Pokud pova\u017eujeme tento blok za blok zvukov\u00fdch vzork\u016f, nen\u00ed to nic jin\u00e9ho ne\u017e ticho. Na prvn\u00ed pohled se m\u016f\u017ee zd\u00e1t zvl\u00e1\u0161tn\u00ed generovat bloky dat s tichem \u2014 v\u017edy\u0165 to nelze sly\u0161et, ale tyto bloky jsou nezbytn\u00e9 pro pr\u00e1ci gener\u00e1toru zvukov\u00e9ho sign\u00e1lu. Gener\u00e1tor pou\u017e\u00edv\u00e1 tyto bloky jako \u010dist\u00fd list pap\u00edru, na kter\u00fd zapisuje zvukov\u00e9 vzorky. Ve sv\u00e9m b\u011b\u017en\u00e9m stavu je gener\u00e1tor vypnut\u00fd a prost\u011b pos\u00edl\u00e1 vstupn\u00ed bloky na v\u00fdstup. Takto bloky ticha proch\u00e1zej\u00ed beze zm\u011bny celou sch\u00e9mou zleva doprava, p\u0159i\u010dem\u017e se dost\u00e1vaj\u00ed do zvukov\u00e9 karty. Ta bezhlu\u010dn\u011b odeb\u00edr\u00e1 bloky z fronty p\u0159ipojen\u00e9 k jej\u00edmu vstupu.<\/p>\n<p><\/p>\n<p>Ale v\u0161echno se zm\u011bn\u00ed, pokud gener\u00e1toru d\u00e1me p\u0159\u00edkaz k p\u0159ehr\u00e1n\u00ed zvuku, za\u010dne vytv\u00e1\u0159et zvukov\u00e9 vzorky a nahrazuje jimi vzorky ve vstupn\u00edch bloc\u00edch a vystavuje zm\u011bn\u011bn\u00e9 bloky na v\u00fdstup. Zvukov\u00e1 karta za\u010dne p\u0159ehr\u00e1vat zvuk. N\u00ed\u017ee je uveden program, kter\u00fd implementuje v\u00fd\u0161e popsan\u00e9 sch\u00e9ma pr\u00e1ce:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/* \u0424\u0430\u0439\u043b mstest2.c *\/\n#include &lt;mediastreamer2\/msfilter.h&gt;\n#include &lt;mediastreamer2\/msticker.h&gt;\n#include &lt;mediastreamer2\/dtmfgen.h&gt;\n#include &lt;mediastreamer2\/mssndcard.h&gt;\nint main()\n{\n    ms_init();\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432. *\/\n    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);\n    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);\n    MSSndCard *card_playback = ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());\n    MSFilter  *snd_card_write = ms_snd_card_create_writer(card_playback);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0438\u043a\u0435\u0440. *\/\n    MSTicker *ticker = ms_ticker_new();\n\n    \/* \u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443. *\/\n    ms_filter_link(voidsource, 0, dtmfgen, 0);\n    ms_filter_link(dtmfgen, 0, snd_card_write, 0);\n\n   \/* \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0430\u043a\u0442\u043e\u0432. *\/\n   ms_ticker_attach(ticker, voidsource);\n\n   \/* \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. *\/\n   char key='1';\n   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&amp;key);\n\n   \/* \u0414\u0430\u0435\u043c, \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0439.*\/\n   ms_sleep(2);   \n}<\/code><\/pre>\n<p><\/p>\n<p>Po inicializaci mediastreameru se provede vytvo\u0159en\u00ed t\u0159\u00ed filtr\u016f: <em>voidsource, dtmfgen, snd_card_write<\/em>. Vytvo\u0159\u00ed se zdroj taktov\u00e9ho sign\u00e1lu.<\/p>\n<p><\/p>\n<p>Pot\u00e9 je pot\u0159eba prov\u00e9st propojen\u00ed filtr\u016f podle na\u0161\u00ed sch\u00e9ma, p\u0159i\u010dem\u017e zdroj taktov\u00e1n\u00ed je t\u0159eba p\u0159ipojit jako posledn\u00ed, proto\u017ee pot\u00e9 okam\u017eit\u011b za\u010dne fungov\u00e1n\u00ed sch\u00e9matu. Pokud p\u0159ipoj\u00edte zdroj taktov\u00e1n\u00ed k nedokon\u010den\u00e9 sch\u00e9matu, m\u016f\u017ee se st\u00e1t, \u017ee medi\u00e1ln\u00ed streamer dojde k hav\u00e1rii, pokud zjist\u00ed v \u0159et\u011bzci alespo\u0148 jeden filtr, jeho\u017e v\u0161echny vstupy nebo v\u0161echny v\u00fdstupy &quot;vis\u00ed ve vzduchu&quot; (nejsou p\u0159ipojeny). <\/p>\n<p><\/p>\n<p>Propojen\u00ed filtr\u016f se prov\u00e1d\u00ed pomoc\u00ed funkce <\/p>\n<p><\/p>\n<pre><code class=\"cpp\">ms_filter_link(src, src_out, dst, dst_in)<\/code><\/pre>\n<p><\/p>\n<p>kde prvn\u00ed argument je ukazatel na filtr- zdroj, druh\u00fd argument \u2014 \u010d\u00edslo v\u00fdstupu zdroje (v\u0161imn\u011bte si, \u017ee vstupy a v\u00fdstupy jsou \u010d\u00edslov\u00e1ny od nuly). T\u0159et\u00ed argument je ukazatel na filtr-p\u0159ij\u00edma\u010d, \u010dtvrt\u00fd \u2014 \u010d\u00edslo vstupu p\u0159ij\u00edma\u010de.<\/p>\n<p><\/p>\n<p>V\u0161echny filtry jsou spojeny a posledn\u00ed se p\u0159ipojuje ke zdroji taktov\u00e1n\u00ed (d\u00e1le budeme jednodu\u0161e \u0159\u00edkat ticker). Pot\u00e9 se na\u0161e zvukov\u00e1 sch\u00e9ma spust\u00ed do provozu, ale ve reproduktorech po\u010d\u00edta\u010de zat\u00edm nen\u00ed nic sly\u0161et \u2014 zvukov\u00fd gener\u00e1tor je vypnut\u00fd a jednodu\u0161e proch\u00e1z\u00ed vstupn\u00edmi bloky dat v tichu. Abychom spustili generaci ton\u00e1ln\u00edho sign\u00e1lu, je nutn\u00e9 prov\u00e9st metodu filtru gener\u00e1toru.<\/p>\n<p><\/p>\n<p>Vygenerujeme dvout\u00f3nov\u00fd (DTMF) sign\u00e1l odpov\u00eddaj\u00edc\u00ed stisknut\u00ed tla\u010d\u00edtka &quot;1&quot; na telefonu. K tomu pou\u017eijeme funkci <em>ms_filter_call_method()<\/em> vol\u00e1me metodu MS_DTMF_GEN_PLAY a p\u0159ed\u00e1me j\u00ed jako argument ukazatel na k\u00f3d, kter\u00e9mu m\u00e1 odpov\u00eddat reprodukovan\u00fd sign\u00e1l.<\/p>\n<p><\/p>\n<p>Zb\u00fdv\u00e1 program zkompilovat:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p><\/p>\n<p>A spustit:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ .\/mstest2<\/code><\/pre>\n<p><\/p>\n<p>Po spu\u0161t\u011bn\u00ed programu usly\u0161\u00edte v reproduktorech po\u010d\u00edta\u010de kr\u00e1tk\u00fd zvukov\u00fd sign\u00e1l slo\u017een\u00fd ze dvou t\u00f3n\u016f.<\/p>\n<p><\/p>\n<p>Sestavili jsme a uvedli do provozu na\u0161i prvn\u00ed zvukovou sch\u00e9mu. Vid\u011bli jsme, jak vytv\u00e1\u0159et instance filtr\u016f, jak je spojovat a jak vyvol\u00e1vat jejich metody. Pot\u00e9, co jsme se pot\u011b\u0161ili prvn\u00edm \u00fasp\u011bchem, je t\u0159eba se zam\u011b\u0159it na to, \u017ee na\u0161e program neuvol\u0148uje alokovanou pam\u011b\u0165 p\u0159ed ukon\u010den\u00edm. V p\u0159\u00ed\u0161t\u00edm <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495780\/\">\u010dl\u00e1nku<\/a><\/noindex> se nau\u010d\u00edme ukl\u00edzet po sob\u011b.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495728\/\">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. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0441\u043e\u0431\u0440\u0430\u0432 \u043f\u0440\u043e\u0431\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u043f\u0438\u043b\u0438\u043a\u0430\u0442\u044c \u043d\u0430 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0442\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0438\u0436\u0435 \u0441\u0445\u0435\u043c\u0443 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430: \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u0445\u0435\u043c\u0443 \u0441\u043b\u0435\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87068,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87067","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.3 - 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\/cs\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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 2 | 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\/cs\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2\" \/>\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-07-03T05:42:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-03T05:42:03+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\udd47Studujeme VoIP engine Mediastreamer2. \u010c\u00e1st 2 | ProHoster","description":"Materi\u00e1l \u010dl\u00e1nku poch\u00e1z\u00ed z m\u00e9ho Dzen kan\u00e1lu.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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 2 | 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\/cs\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","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-07-03T05:42:03+00:00","article:modified_time":"2020-07-03T05:42:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87067","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"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 13:59:55","updated":"2022-10-04 22:45:55","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=87067"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87067\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/87068"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=87067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=87067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=87067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}