{"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\/ro\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","title":{"rendered":"Explor\u0103m motorul VoIP Mediastreamer2. Partea 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Materialul articolului provine de pe canalul meu <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">zen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Explor\u0103m motorul VoIP Mediastreamer2. Partea 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\">Cre\u0103m un generator tonal<\/h2>\n<p><\/p>\n<p>\u00cen articolul anterior <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495702\/\">pe care l-a\u021bi citit<\/a><\/noindex> Am instalat biblioteca de mediar\u0103, instrumentele de dezvoltare \u0219i am verificat func\u021bionarea lor, realiz\u00e2nd o aplica\u021bie de prob\u0103.<\/p>\n<p><\/p>\n<p>Azi vom crea o aplica\u021bie care va putea genera un semnal tonal pe placa de sunet. Pentru a rezolva aceast\u0103 sarcin\u0103, trebuie s\u0103 conect\u0103m filtrele conform schemei generatorului de sunet prezentate mai jos:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Explor\u0103m motorul VoIP Mediastreamer2. Partea 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>Citind schema de la st\u00e2nga la dreapta, \u00een aceast\u0103 direc\u021bie se desf\u0103\u0219oar\u0103 fluxul de date. S\u0103ge\u021bile sugereaz\u0103 de asemenea acest lucru. Filtrele sunt reprezentate prin dreptunghiuri, care prelucreaz\u0103 blocuri de date \u0219i emit rezultatul la ie\u0219ire. \u00cen interiorul dreptunghiului este indicat\u0103 func\u021bia sa, iar mai jos tipul filtrului cu litere mari. S\u0103ge\u021bile care conecteaz\u0103 dreptunghiurile reprezint\u0103 cozi de date, prin care blocurile de date sunt livrate de la un filtru la altul. \u00cen general, un filtru poate avea multe intr\u0103ri \u0219i ie\u0219iri.<\/p>\n<p><\/p>\n<p>Totul \u00eencepe de la sursa de ceas, care stabile\u0219te ritmul \u00een care se face procesarea datelor \u00een filtre. La fiecare impuls, fiecare filtru prelucreaz\u0103 toate blocurile de date care sunt la intrarea sa. \u0218i emite blocurile cu rezultatul la ie\u0219ire - \u00een coad\u0103. Cel mai apropiat de sursa de ceas prelucreaz\u0103 \u00eent\u00e2i, urmat de filtrele conectate la ie\u0219irile sale (care pot fi multe) \u0219i a\u0219a mai departe. Dup\u0103 ce ultimul filtru din lan\u021b termin\u0103 procesarea, execu\u021bia se opre\u0219te p\u00e2n\u0103 c\u00e2nd se prime\u0219te un nou impuls. Impulsurile, \u00een mod implicit, vin la intervale de 10 milisecunde. <\/p>\n<p><\/p>\n<p>S\u0103 ne \u00eentoarcem la schema noastr\u0103. Semnalele intr\u0103 \u00een sursa de t\u0103cere, acesta este un filtru care genereaz\u0103 la fiecare ciclu, pe ie\u0219irea sa, un bloc de date ce con\u021bine zerouri. Dac\u0103 analiz\u0103m acest bloc ca un bloc de mostre sonore, nu este altceva dec\u00e2t t\u0103cere. La prima vedere, pare ciudat s\u0103 generezi blocuri de date cu t\u0103cere \u2014 pentru c\u0103 nu poate fi auzit\u0103, dar aceste blocuri sunt necesare pentru func\u021bionarea generatorului de semnal sonor. Generatorul folose\u0219te aceste blocuri ca un simplu caiet, not\u00e2nd \u00een ele mostrele sonore. \u00cen starea sa normal\u0103, generatorul este oprit \u0219i pur \u0219i simplu transmite blocurile de intrare pe ie\u0219ire. Astfel, blocurile de t\u0103cere trec f\u0103r\u0103 modific\u0103ri prin \u00eentreaga schem\u0103 de la st\u00e2nga la dreapta, ajung\u00e2nd la placa de sunet care, f\u0103r\u0103 a face zgomot, preia blocurile din coada conectat\u0103 la intrarea sa.<\/p>\n<p><\/p>\n<p>Dar totul se schimb\u0103 dac\u0103 generatorului i se d\u0103 comanda de a reda sunetul, acesta \u00eencepe s\u0103 genereze mostre sonore \u0219i le \u00eenlocuie\u0219te pe cele din blocurile de intrare, apoi expune blocurile modificate la ie\u0219ire. Placa de sunet \u00eencepe s\u0103 redea sunetul. Mai jos este programul care realizeaz\u0103 schema de func\u021bionare descris\u0103 mai sus:<\/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>Dup\u0103 ini\u021bializarea media streamer-ului, se creeaz\u0103 trei filtre: <em>voidsource, dtmfgen, snd_card_write<\/em>. Se creeaz\u0103 o surs\u0103 de semnal de ceas.<\/p>\n<p><\/p>\n<p>Apoi trebuie s\u0103 realiz\u0103m conectarea filtrelor conform schemei noastre, av\u00e2nd \u00een vedere c\u0103 sursa de ceas trebuie conectat\u0103 ultima, deoarece dup\u0103 aceasta schema va \u00eencepe imediat s\u0103 func\u021bioneze. Dac\u0103 conect\u0103m sursa de ceas la o schem\u0103 neterminat\u0103, este posibil ca mediastreamer-ul s\u0103 se \u00eenchid\u0103 de urgen\u021b\u0103, dac\u0103 detecteaz\u0103 \u00een lan\u021bul de filtre cel pu\u021bin un filtru la care toate intr\u0103rile sau toate ie\u0219irile sunt \u201esuspendate\u201d (neconectate). <\/p>\n<p><\/p>\n<p>Conectarea filtrelor se realizeaz\u0103 prin func\u021bia <\/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>unde primul argument este un pointer c\u0103tre filtru-surs\u0103, al doilea argument \u2014 num\u0103rul ie\u0219irii sursei (re\u021bine\u021bi c\u0103 intr\u0103rile \u0219i ie\u0219irile sunt numerotate \u00eencep\u00e2nd cu zero). Al treilea argument este un pointer c\u0103tre filtru-receptor, iar al patrulea \u2014 num\u0103rul intr\u0103rii receptorului.<\/p>\n<p><\/p>\n<p>Toate filtrele sunt conectate iar sursa de ceas (pe care o vom numi simplu tick) se conecteaz\u0103 ultima. Dup\u0103 aceasta, schema noastr\u0103 sonor\u0103 \u00eencepe s\u0103 func\u021bioneze, dar \u00een difuzorul computerului nu se aude nimic \u2014 generatorul de sunet este oprit \u0219i pur \u0219i simplu transmite blocurile de date de intrare \u00een t\u0103cere. Pentru a porni generarea unui semnal tonat, trebuie s\u0103 apel\u0103m metoda filtrului generatorului.<\/p>\n<p><\/p>\n<p>Vom genera un semnal dual-tone (DTMF) corespunz\u0103tor ap\u0103s\u0103rii tastei \u201e1\u201d pe telefon. Pentru aceasta, vom folosi func\u021bia <em>ms_filter_call_method()<\/em> apel\u00e2nd metoda MS_DTMF_GEN_PLAY, trec\u00e2nd ca argument un pointer la codul c\u0103ruia ar trebui s\u0103 corespund\u0103 semnalul redat.<\/p>\n<p><\/p>\n<p>R\u0103m\u00e2ne s\u0103 compil\u0103m programul:<\/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>\u0218i s\u0103 rul\u0103m:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ .\\\/mstest2<\/code><\/pre>\n<p><\/p>\n<p>Dup\u0103 ce programul este pornit, ve\u021bi auzi \u00een difuzorul computerului un scurt semnal sonor format din dou\u0103 tonuri.<\/p>\n<p><\/p>\n<p>Am construit \u0219i am pus \u00een func\u021biune prima noastr\u0103 schem\u0103 sonor\u0103. Am v\u0103zut cum s\u0103 cre\u0103m instan\u021be de filtre, cum s\u0103 le conect\u0103m \u0219i cum s\u0103 apel\u0103m metodele lor. Bucur\u00e2ndu-ne de primul succes, trebuie totu\u0219i s\u0103 ne concentr\u0103m asupra faptului c\u0103 programul nostru nu elibereaz\u0103 memoria alocat\u0103 \u00eenainte de \u00eencheiere. \u00cen urm\u0103toarea <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495780\/\">pe care l-a\u021bi citit<\/a><\/noindex> vom \u00eenv\u0103\u021ba s\u0103 cur\u0103\u021b\u0103m dup\u0103 noi.<\/p>\n<p>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Explor\u0103m motorul VoIP Mediastreamer2. Partea 2 | ProHoster","description":"Materialul articolului este preluat de pe canalul meu de Zen.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/87067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=87067"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/87067\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/87068"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=87067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=87067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=87067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}