{"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\/fr\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","title":{"rendered":"Explorons le moteur VoIP Mediastreamer2. Partie 1","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<h2 id=\"vvedenie\">Introduction<\/h2>\n<p>Cet article est le d\u00e9but d'une s\u00e9rie sur le traitement en temps r\u00e9el des donn\u00e9es multim\u00e9dias \u00e0 l'aide du moteur Mediastreamer2. Dans le cours de l'expos\u00e9, des comp\u00e9tences minimales en terminal Linux et en programmation en langage C seront n\u00e9cessaires.<\/p>\n<p>Mediastreamer2 est un moteur VoIP qui constitue la base du projet open-source populaire de t\u00e9l\u00e9phone VoIP. <noindex><a rel=\"nofollow\" href=\"http:\/\/linphone.org\/\">Linphone<\/a><\/noindex>. Dans Linphone, Mediastreamer2 impl\u00e9mente toutes les fonctionnalit\u00e9s li\u00e9es au son et \u00e0 la vid\u00e9o. La liste d\u00e9taill\u00e9e des capacit\u00e9s du moteur se trouve sur cette page Mediastreamer. Le code source est disponible ici : <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.linphone.org\/BC\/public\/mediastreamer2\">GitLab<\/a><\/noindex>.<\/p>\n<p>Dans le texte qui suit, pour plus de commodit\u00e9, nous utiliserons la notation fran\u00e7aise du mot Mediastreamer2 : \u00ab m\u00e9diastreamer \u00bb.<\/p>\n<p>L'histoire de sa cr\u00e9ation n'est pas tout \u00e0 fait claire, mais \u00e0 en juger par son code source, il utilisait auparavant la biblioth\u00e8que <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GLib\">Glib<\/a><\/noindex>, ce qui sous-entend une possible parent\u00e9 lointaine avec <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GStreamer\">GStreamer<\/a><\/noindex>. Compar\u00e9 \u00e0 lui, le \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440 semble plus l\u00e9ger. La premi\u00e8re version de Linphone est apparue en 2001, de sorte qu'\u00e0 pr\u00e9sent, le \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440 existe et se d\u00e9veloppe depuis presque 20 ans.<\/p>\n<p>\u00c0 la base du mediastreamer se trouve une architecture appel\u00e9e \u00ab Data flow \u00bb (flux de donn\u00e9es). Un exemple de cette architecture est illustr\u00e9 dans l'image ci-dessous.<\/p>\n<p><img decoding=\"async\" alt=\"Explorons le moteur VoIP Mediastreamer2. Partie 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>Dans cette architecture, l'algorithme de traitement des donn\u00e9es est d\u00e9fini non pas par du code, mais par un sch\u00e9ma (graphe) de connexion de fonctions qui peuvent \u00eatre agenc\u00e9es dans n'importe quel ordre. Ces fonctions sont appel\u00e9es filtres.<\/p>\n<p>Cette architecture permet de r\u00e9aliser des fonctionnalit\u00e9s de traitement multim\u00e9dia sous la forme d'un ensemble de filtres connect\u00e9s dans un sch\u00e9ma de traitement et de transmission du trafic RTP d'un t\u00e9l\u00e9phone VoIP.<\/p>\n<p>La possibilit\u00e9 de connecter des filtres dans des sch\u00e9mas arbitraires, la facilit\u00e9 de d\u00e9veloppement de nouveaux filtres et la mise en \u0153uvre du \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 en tant que biblioth\u00e8que autonome permettent de l'utiliser \u00e9galement dans d'autres projets. De plus, le projet peut se situer dans le domaine du VoIP, car il est possible d'ajouter des filtres con\u00e7us par ses propres soins.<\/p>\n<p>La biblioth\u00e8que de filtres fournie par d\u00e9faut est assez riche et, comme d\u00e9j\u00e0 mentionn\u00e9, peut \u00eatre \u00e9tendue avec des filtres d\u00e9velopp\u00e9s soi-m\u00eame. Mais d'abord, d\u00e9crivons les filtres pr\u00eats \u00e0 l'emploi qui sont fournis avec le \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440. Voici leur liste :<\/p>\n<h3 id=\"zvukovye-filtry\">Filtres sonores<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-zvuka\">Capture et reproduction du son<\/h4>\n<ul>\n<li>Alsa (Linux) : MS_ALSA_WRITE, MS_ALSA_READ<\/li>\n<li>Son natif Android (libmedia) : MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ<\/li>\n<li>Service de file d'attente audio (Mac OS X) : MS_AQ_WRITE, MS_AQ_READ<\/li>\n<li>Service d'unit\u00e9s 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>Lecteur de fichiers (raw\/wav\/pcap) (Linux): MS_FILE_PLAYER<\/li>\n<li>Lecteur de fichiers (raw\/wav) (Windows): MS_WINSND_READ<\/li>\n<li>Enregistrement dans un fichier (wav) (Linux): MS_FILE_REC<\/li>\n<li>Enregistrement dans un fichier (wav) (Windows): MS_WINSND_WRITE<\/li>\n<li>Unit\u00e9 audio Mac (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>Son Windows (Windows)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-zvuka\">Codage\/d\u00e9codage audio<\/h4>\n<ul>\n<li>G.711 a-loi: MS_ALAW_DEC, MS_ALAW_ENC<\/li>\n<li>G.711 \u00b5-loi: 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>PCM lin\u00e9aire: MS_L16_ENC, MS_L16_DEC<\/li>\n<li>Speex: MS_SPEEX_ENC, MS_SPEEX_DEC<\/li>\n<\/ul>\n<h4 id=\"obrabotka-zvuka\">Traitement audio<\/h4>\n<ul>\n<li>Adaptateur de canal (mono-&gt;st\u00e9r\u00e9o, st\u00e9r\u00e9o-&gt;mono): MS_CHANNEL_ADAPTER<\/li>\n<li>Conf\u00e9rence: MS_CONF<\/li>\n<li>G\u00e9n\u00e9rateur DTMF: MS_DTMF_GEN<\/li>\n<li>Suppression d'\u00e9cho (speex): MS_SPEEX_EC<\/li>\n<li>\u00c9galiseur: MS_EQUALIZER<\/li>\n<li>Mixeur: MS_MIXER<\/li>\n<li>Compensateur de perte de paquets (PLC): MS_GENERIC_PLC<\/li>\n<li>R\u00e9\u00e9chantillonneur: MS_RESAMPLE<\/li>\n<li>D\u00e9tecteur de tonalit\u00e9: MS_TONE_DETECTOR<\/li>\n<li>Contr\u00f4le du volume et mesure du niveau de signal: MS_VOLUME<\/li>\n<\/ul>\n<h3 id=\"filtry-video\">Filtres vid\u00e9o<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-video\">Capture et lecture vid\u00e9o<\/h4>\n<ul>\n<li>Capture Android<\/li>\n<li>Lecture Android<\/li>\n<li>Capture AV Foundation (iOS)<\/li>\n<li>Lecture AV Foundation (iOS)<\/li>\n<li>Capture DirectShow (Windows)<\/li>\n<li>Lecture DrawDib (Windows)<\/li>\n<li>Lecture externe \u2014 Envoi vid\u00e9o au niveau sup\u00e9rieur<\/li>\n<li>Lecture GLX (Linux): MS_GLXVIDEO<\/li>\n<li>Mire \u2014 Image en mouvement synth\u00e9tique: MS_MIRE<\/li>\n<li>Lecture OpenGL (Mac OS X)<\/li>\n<li>Lecture OpenGL ES2 (Android)<\/li>\n<li>Capture Quicktime (Mac OS X)<\/li>\n<li>Lecture SDL: MS_SDL_OUT<\/li>\n<li>Sortie d'images statiques: MS_STATIC_IMAGE<\/li>\n<li>Capture Video For Linux (V4L) (Linux): MS_V4L<\/li>\n<li>Capture Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE<\/li>\n<li>Capture Video4windows (DirectShow) (Windows)<\/li>\n<li>Capture Video4windows (DirectShow) (Windows CE)<\/li>\n<li>Capture Video For Windows (vfw) (Windows)<\/li>\n<li>Lecture XV (Linux)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-video\">Codage\/D\u00e9codage vid\u00e9o<\/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 (d\u00e9codage uniquement): 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\">Traitement vid\u00e9o<\/h4>\n<ul>\n<li>Instantan\u00e9 JPEG<\/li>\n<li>Convertisseur de format pixel: MS_PIX_CONV<\/li>\n<li>Redimensionneur<\/li>\n<li>Autres filtres<\/li>\n<li>\u00c9change de blocs de donn\u00e9es entre threads: MS_ITC_SOURCE, MS_ITC_SINK<\/li>\n<li>Assemblage de blocs de donn\u00e9es \u00e0 partir de plusieurs entr\u00e9es vers une sortie: MS_JOIN<\/li>\n<li>Transmission\/ r\u00e9ception RTP: MS_RTP_SEND, MS_RTP_RECV<\/li>\n<li>Duplication des entr\u00e9es sur plusieurs sorties: MS_TEE<\/li>\n<li>Charge coh\u00e9rente: MS_VOID_SINK<\/li>\n<li>Source de silence: MS_VOID_SOURCE<\/li>\n<\/ul>\n<h3 id=\"plaginy\">Plugins<\/h3>\n<h4 id=\"zvukovye-filtry-1\">Filtres sonores<\/h4>\n<ul>\n<li>Encodeur\/d\u00e9codeur AMR-NB<\/li>\n<li>Encodeur\/d\u00e9codeur G.729<\/li>\n<li>Encodeur\/d\u00e9codeur iLBC<\/li>\n<li>Encodeur\/d\u00e9codeur SILK<br \/>\n<h4 id=\"filtry-video\">Filtres vid\u00e9o<\/h4>\n<\/li>\n<li>Encodeur logiciel H.264<\/li>\n<li>Encodeur\/d\u00e9codeur H.264 V4L2 avec acc\u00e9l\u00e9ration mat\u00e9rielle<\/li>\n<\/ul>\n<p>Apr\u00e8s une br\u00e8ve description du filtre, le nom du type utilis\u00e9 pour cr\u00e9er une nouvelle instance de ce filtre est affich\u00e9. Dans la suite de cet expos\u00e9, nous ferons r\u00e9f\u00e9rence \u00e0 cette liste.<\/p>\n<h2 id=\"ustanovka-pod-linux-ubuntu\">Installation sur Linux Ubuntu<\/h2>\n<p>Nous allons maintenant proc\u00e9der \u00e0 l'installation du m\u00e9diastreamer sur l'ordinateur et cr\u00e9er notre premi\u00e8re application avec.<\/p>\n<p>L'installation de Mediastreamer2 sur un ordinateur ou une machine virtuelle sous Ubuntu ne n\u00e9cessite pas de comp\u00e9tences particuli\u00e8res. Ici et plus loin, le symbole \u00ab $ \u00bb indiquera l'invite du shell pour entrer des commandes. Donc, si vous voyez ce symbole au d\u00e9but d'une ligne dans le listing, cela signifie qu'il s'agit d'une ligne montrant des commandes \u00e0 ex\u00e9cuter dans le terminal.<\/p>\n<p>Il est suppos\u00e9 qu'au cours des actions d\u00e9crites dans cet article, votre ordinateur a acc\u00e8s \u00e0 Internet.<\/p>\n<h4 id=\"ustanovka-paketa-libmediastremer-dev\">Installation du paquet libmediastremer-dev<\/h4>\n<p>Nous ouvrons le terminal et saisissons la commande :<\/p>\n<pre><code class=\"bash\">$ sudo apt-get update<\/code><\/pre>\n<p>Un mot de passe pour effectuer des modifications sera demand\u00e9, saisissez-le et le gestionnaire de paquets mettra \u00e0 jour ses bases. Ensuite, il faut ex\u00e9cuter :<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install libmediastreamer-dev<\/code><\/pre>\n<p>Les paquets de d\u00e9pendances n\u00e9cessaires et la biblioth\u00e8que m\u00e9diastreamer elle-m\u00eame seront automatiquement t\u00e9l\u00e9charg\u00e9s et install\u00e9s.<\/p>\n<p>La taille totale des paquets .deb de d\u00e9pendances t\u00e9l\u00e9charg\u00e9s sera d'environ 35 Mo. Vous pouvez obtenir des d\u00e9tails sur le paquet install\u00e9 en utilisant la commande :<\/p>\n<pre><code class=\"bash\">$ dpkg -s libmediastreamer-dev<\/code><\/pre>\n<p>Exemple de r\u00e9ponse :<\/p>\n<pre><code class=\"bash\">Paquet : libmediastreamer-dev\nStatut : install ok installed\nPriorit\u00e9 : optionnel\nSection : libdevel\nTaille install\u00e9e : 244\nMainteneur : D\u00e9veloppeurs Ubuntu \nArchitecture : amd64\nSource : linphone\nVersion : 3.6.1-2.5\nD\u00e9pend : libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev\nDescription : Biblioth\u00e8que multim\u00e9dia du t\u00e9l\u00e9phone web Linphone - fichiers de d\u00e9veloppement\nLinphone est un t\u00e9l\u00e9phone internet audio et vid\u00e9o utilisant le protocole SIP. Il dispose d'une interface GTK+ et console, inclut une large vari\u00e9t\u00e9 de codecs audio et vid\u00e9o, et fournit des fonctionnalit\u00e9s de messagerie instantan\u00e9e.\n.\nCe paquet contient les biblioth\u00e8ques de d\u00e9veloppement pour la gestion des op\u00e9rations multim\u00e9dia.\nMainteneur d'origine : \u00c9quipe VoIP de Debian \nPage d'accueil : http:\/\/www.linphone.org\/\n<\/code><\/pre>\n<h4 id=\"ustanovka-instrumentov-razrabotki\">Installation des outils de d\u00e9veloppement<\/h4>\n<p>Nous installons le compilateur C et les outils associ\u00e9s :<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install gcc<\/code><\/pre>\n<p>V\u00e9rifions le r\u00e9sultat en demandant la version du compilateur :<\/p>\n<pre><code class=\"bash\">$ gcc --version<\/code><\/pre>\n<p>La r\u00e9ponse devrait \u00eatre \u00e0 peu pr\u00e8s de cette fa\u00e7on :<\/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.\nCe logiciel est libre ; consultez la source pour les conditions de copie.  Il n'y a AUCUNE\ngarantie ; pas m\u00eame pour COMMERCIALISATION ou AD\u00c9QUATION \u00c0 UN USAGE PARTICULIER.<\/code><\/pre>\n<h4 id=\"sborka-i-zapusk-probnogo-prilozheniya\">Compilation et ex\u00e9cution d'une application test<\/h4>\n<p>Cr\u00e9ons dans <em>home<\/em> un dossier pour nos projets d'apprentissage, appelons-le <em>mstutorial<\/em>:<\/p>\n<pre><code class=\"bash\">$ mkdir ~\/mstutorial<\/code><\/pre>\n<p>Utilisez votre \u00e9diteur de texte pr\u00e9f\u00e9r\u00e9 et cr\u00e9ez un fichier de programme C nomm\u00e9 <em>mstest.c<\/em> avec le contenu suivant :<\/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>Il initialise le m\u00e9diastreamer, imprime un message de bienvenue et termine l'ex\u00e9cution.<\/p>\n<p>Enregistrez le fichier et compilez l'application test avec la commande :<\/p>\n<pre><code class=\"bash\">$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>Veuillez noter que la ligne<\/p>\n<pre><code class=\"bash\">`pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>est enferm\u00e9 entre des guillemets, qui se trouvent sur le clavier au m\u00eame endroit que la lettre \u00ab \u0401 \u00bb.<\/p>\n<p>Si le fichier ne contient pas d'erreurs, un fichier <em>mstest<\/em>appara\u00eetra dans le r\u00e9pertoire apr\u00e8s la compilation :<\/p>\n<pre><code class=\"bash\">$ .\\\/mstest<\/code><\/pre>\n<p>Le r\u00e9sultat sera le suivant :<\/p>\n<pre><code class=\"bash\">ALSA lib conf.c:4738:(snd_config_expand) Param\u00e8tres inconnus 0\nALSA lib control.c:954:(snd_ctl_open_noupdate) CTL par d\u00e9faut invalide:0\nortp-warning-Could not attach mixer to card: Invalid argument\nALSA lib conf.c:4738:(snd_config_expand) Param\u00e8tres inconnus 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM inconnu par d\u00e9faut:0\nALSA lib conf.c:4738:(snd_config_expand) Param\u00e8tres inconnus 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM inconnu par d\u00e9faut:0\nortp-warning-Strange, sound card HDA Intel PCH does not seems to be capable of anything, retrying with plughw...\nMediastreamer is ready.<\/code><\/pre>\n<p>Dans cette liste, nous voyons les messages d'erreur g\u00e9n\u00e9r\u00e9s par la biblioth\u00e8que ALSA, qui est utilis\u00e9e pour g\u00e9rer la carte son. Les d\u00e9veloppeurs de Mediastreamer consid\u00e8rent que c'est normal. Dans ce cas, nous serons d'accord avec eux \u00e0 contrec\u0153ur.<\/p>\n<p>Nous sommes maintenant pr\u00eats \u00e0 travailler avec Mediastreamer. Nous avons install\u00e9 la biblioth\u00e8que Mediastreamer, l'outil de compilation et avons v\u00e9rifi\u00e9 \u00e0 l'aide d'une application test que les outils sont configur\u00e9s et que Mediastreamer s'initialise avec succ\u00e8s.<\/p>\n<p>Dans la prochaine <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495728\/\">article<\/a><\/noindex> nous allons cr\u00e9er une application qui assemblera et lancera le traitement du signal audio dans une cha\u00eene de plusieurs filtres.<\/p>\n<p>Source : <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.4 - 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-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\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 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\/fr\/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\udd47Explorons le moteur VoIP Mediastreamer2. Partie 1 | 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-1","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 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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/77011","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=77011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/77011\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/77012"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=77011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=77011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=77011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}