{"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\/fr\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","title":{"rendered":"Explorons le moteur VoIP Mediastreamer2. Partie 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Le contenu de cet article est tir\u00e9 de ma <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">cha\u00eene Zen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Explorons le moteur VoIP Mediastreamer2. Partie 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\">Cr\u00e9ons un g\u00e9n\u00e9rateur tonal<\/h2>\n<p><\/p>\n<p>Dans l'article pr\u00e9c\u00e9dent <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495702\/\">article<\/a><\/noindex> Nous avons install\u00e9 la biblioth\u00e8que de streaming multim\u00e9dia, des outils de d\u00e9veloppement et v\u00e9rifi\u00e9 leur fonctionnement en assemblant une application de test.<\/p>\n<p><\/p>\n<p>Aujourd'hui, nous allons cr\u00e9er une application capable de g\u00e9n\u00e9rer un signal tonal sur la carte sonore. Pour r\u00e9aliser cette t\u00e2che, nous devons connecter les filtres selon le sch\u00e9ma suivant du g\u00e9n\u00e9rateur sonore :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Explorons le moteur VoIP Mediastreamer2. Partie 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>Lire le sch\u00e9ma de gauche \u00e0 droite, c'est dans cette direction que notre flux de donn\u00e9es se d\u00e9place. Les fl\u00e8ches le sugg\u00e8rent \u00e9galement. Les rectangles repr\u00e9sentent les filtres qui traitent les blocs de donn\u00e9es et fournissent le r\u00e9sultat en sortie. \u00c0 l'int\u00e9rieur du rectangle, son r\u00f4le est indiqu\u00e9, avec un peu plus bas en lettres majuscules le type de filtre. Les fl\u00e8ches reliant les rectangles sont des files d'attente de donn\u00e9es, par lesquelles les blocs de donn\u00e9es sont transmis d'un filtre \u00e0 l'autre. En g\u00e9n\u00e9ral, un filtre peut avoir de nombreuses entr\u00e9es et sorties.<\/p>\n<p><\/p>\n<p>Tout commence par une source d'horloge, qui d\u00e9finit le tempo auquel les donn\u00e9es sont trait\u00e9es dans les filtres. \u00c0 chaque impulsion de cette horloge, chaque filtre traite tous les blocs de donn\u00e9es pr\u00e9sents \u00e0 son entr\u00e9e. Il fournit des blocs de r\u00e9sultats en sortie \u2014 dans une file d'attente. Tout d'abord, le filtre le plus proche de la source d'horloge effectue le traitement, puis les filtres connect\u00e9s \u00e0 ses sorties (il peut y avoir plusieurs sorties) et ainsi de suite. Une fois que le dernier filtre de la cha\u00eene a termin\u00e9 son traitement, l'ex\u00e9cution se met en pause jusqu'\u00e0 ce qu'une nouvelle impulsion arrive. Par d\u00e9faut, les impulsions suivent \u00e0 intervalles de 10 millisecondes. <\/p>\n<p><\/p>\n<p>Revenons \u00e0 notre sch\u00e9ma. Les impulsions arrivent \u00e0 l'entr\u00e9e de la source de silence, c'est un filtre qui s'occupe de g\u00e9n\u00e9rer \u00e0 chaque impulsion un bloc de donn\u00e9es contenant des z\u00e9ros \u00e0 sa sortie. Si l'on consid\u00e8re ce bloc comme un bloc d'\u00e9chantillons sonores, il ne repr\u00e9sente rien d'autre que du silence. \u00c0 premi\u00e8re vue, il semble \u00e9trange de g\u00e9n\u00e9rer des blocs de donn\u00e9es avec du silence \u2014 apr\u00e8s tout, on ne peut pas l'entendre, mais ces blocs sont n\u00e9cessaires au fonctionnement du g\u00e9n\u00e9rateur de signal audio. Le g\u00e9n\u00e9rateur utilise ces blocs comme une feuille de papier vierge, y enregistrant les \u00e9chantillons sonores. Dans son \u00e9tat normal, le g\u00e9n\u00e9rateur est \u00e9teint et simplement transmet les blocs d'entr\u00e9e \u00e0 la sortie. Ainsi, les blocs de silence passent sans modifications \u00e0 travers tout le sch\u00e9ma de gauche \u00e0 droite, atteignant la carte audio. Celle-ci r\u00e9cup\u00e8re silencieusement les blocs depuis la queue connect\u00e9e \u00e0 son entr\u00e9e.<\/p>\n<p><\/p>\n<p>Mais tout change lorsque le g\u00e9n\u00e9rateur re\u00e7oit l'ordre de reproduire du son, il commence \u00e0 g\u00e9n\u00e9rer des \u00e9chantillons sonores et les remplace dans les blocs d'entr\u00e9e, puis envoie les blocs modifi\u00e9s \u00e0 la sortie. La carte audio commence \u00e0 reproduire le son. Voici le programme qui impl\u00e9mente le sch\u00e9ma de fonctionnement d\u00e9crit ci-dessus :<\/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>Apr\u00e8s l'initialisation du flux multim\u00e9dia, trois filtres sont cr\u00e9\u00e9s : <em>voidsource, dtmfgen, snd_card_write<\/em>. Une source du signal d'horloge est cr\u00e9\u00e9e.<\/p>\n<p><\/p>\n<p>Ensuite, il est n\u00e9cessaire de connecter les filtres selon notre sch\u00e9ma, en connectant la source d'horloge en dernier, car apr\u00e8s cela, le sch\u00e9ma commencera imm\u00e9diatement \u00e0 fonctionner. Si vous connectez la source d'horloge \u00e0 un sch\u00e9ma incomplet, il peut arriver que le m\u00e9diastreamer se termine de mani\u00e8re inattendue s'il d\u00e9tecte dans la cha\u00eene au moins un filtre dont toutes les entr\u00e9es ou toutes les sorties sont \"suspendues dans l'air\" (non connect\u00e9es). <\/p>\n<p><\/p>\n<p>La connexion des filtres se fait par la fonction <\/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>o\u00f9 le premier argument est un pointeur vers le filtre source, le deuxi\u00e8me argument \u2014 le num\u00e9ro de la sortie du source (notez que les entr\u00e9es et sorties sont num\u00e9rot\u00e9es \u00e0 partir de z\u00e9ro). Le troisi\u00e8me argument est un pointeur vers le filtre r\u00e9cepteur, le quatri\u00e8me \u2014 le num\u00e9ro de l'entr\u00e9e du r\u00e9cepteur.<\/p>\n<p><\/p>\n<p>Tous les filtres sont connect\u00e9s, et la derni\u00e8re connexion est la source d'horloge (que nous appelerons simplement le ticker). Ensuite, notre sch\u00e9ma sonore commence \u00e0 fonctionner, mais il n'y a pour l'instant aucun son dans les haut-parleurs de l'ordinateur \u2014 le g\u00e9n\u00e9rateur sonore est \u00e9teint et passe simplement les blocs de donn\u00e9es d'entr\u00e9e qui contiennent du silence. Pour commencer la g\u00e9n\u00e9ration d'un signal tonal, il faut ex\u00e9cuter la m\u00e9thode de filtrage du g\u00e9n\u00e9rateur.<\/p>\n<p><\/p>\n<p>Nous allons g\u00e9n\u00e9rer un signal \u00e0 double tonalit\u00e9 (DTMF) correspondant \u00e0 l'appui sur le bouton \"1\" du t\u00e9l\u00e9phone. Pour cela, nous utilisons la fonction <em>ms_filter_call_method()<\/em> pour appeler la m\u00e9thode MS_DTMF_GEN_PLAY, en lui passant un pointeur sur le code correspondant au signal \u00e0 reproduire comme argument.<\/p>\n<p><\/p>\n<p>Il reste \u00e0 compiler le programme :<\/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>Et \u00e0 le lancer :<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ .\/mstest2<\/code><\/pre>\n<p><\/p>\n<p>Apr\u00e8s avoir lanc\u00e9 le programme, vous entendrez un court signal sonore provenant des haut-parleurs de l'ordinateur, compos\u00e9 de deux tonalit\u00e9s.<\/p>\n<p><\/p>\n<p>Nous avons construit et mis en service notre premier sch\u00e9ma sonore. Nous avons vu comment cr\u00e9er des instances de filtres, comment les connecter et comment appeler leurs m\u00e9thodes. Ravie de notre premier succ\u00e8s, nous devons cependant pr\u00eater attention au fait que notre programme ne lib\u00e8re pas la m\u00e9moire allou\u00e9e avant de se terminer. Dans la prochaine <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495780\/\">article<\/a><\/noindex> nous apprendrons \u00e0 nettoyer apr\u00e8s nous.<\/p>\n<p>Source : <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 - 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\/fr\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47D\u00e9couverte du moteur VoIP Mediastreamer2. Partie 2 | ProHoster","description":"Le contenu de cet article est tir\u00e9 de mon canal Zen.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/87067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=87067"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/87067\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/87068"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=87067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=87067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=87067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}