{"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\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","title":{"rendered":"Explorando o mecanismo VoIP Mediastreamer2. Parte 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>O conte\u00fado deste artigo foi retirado do meu <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\">canal Zen<\/a><\/noindex>.<\/p>\n<h2 id=\"vvedenie\">Introdu\u00e7\u00e3o<\/h2>\n<p>Este artigo \u00e9 o in\u00edcio de uma s\u00e9rie de artigos sobre o processamento em tempo real de dados de m\u00eddia usando o mecanismo Mediastreamer2. Durante a apresenta\u00e7\u00e3o, ser\u00e3o utilizados conhecimentos b\u00e1sicos sobre o terminal Linux e programa\u00e7\u00e3o em C.<\/p>\n<p>Mediastreamer2 \u00e9 um mecanismo VoIP que serve de base para o popular projeto open-source de um telefone VoIP. <noindex><a rel=\"nofollow\" href=\"http:\/\/linphone.org\/\">Linphone<\/a><\/noindex>. No Linphone, o Mediastreamer2 implementa todas as fun\u00e7\u00f5es relacionadas ao \u00e1udio e v\u00eddeo. Uma lista detalhada das capacidades do mecanismo pode ser vista nesta p\u00e1gina do Mediastreamer. O c\u00f3digo fonte est\u00e1 dispon\u00edvel aqui: <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.linphone.org\/BC\/public\/mediastreamer2\">GitLab<\/a><\/noindex>.<\/p>\n<p>A seguir no texto, para conveni\u00eancia, em vez da palavra Mediastreamer2 usaremos sua nota\u00e7\u00e3o em portugu\u00eas: &#171;mediastreamer&#187;.<\/p>\n<p>A hist\u00f3ria de sua cria\u00e7\u00e3o n\u00e3o \u00e9 completamente clara, mas, de acordo com seu c\u00f3digo fonte, ele usou anteriormente a biblioteca <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GLib\">Glib<\/a><\/noindex>, o que sugere uma poss\u00edvel rela\u00e7\u00e3o distante com <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/GStreamer\">GStreamer<\/a><\/noindex>. Em compara\u00e7\u00e3o, o midiastreamer parece ser mais leve. A primeira vers\u00e3o do Linphone foi lan\u00e7ada em 2001, portanto, atualmente o midiastreamer existe e se desenvolve h\u00e1 quase 20 anos.<\/p>\n<p>A base do mediastreamer \u00e9 uma arquitetura chamada &#171;Data flow&#187; (fluxo de dados). Um exemplo dessa arquitetura \u00e9 mostrado na figura abaixo.<\/p>\n<p><img decoding=\"async\" alt=\"Explorando o mecanismo VoIP Mediastreamer2. Parte 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>Nessa arquitetura, o algoritmo de processamento de dados \u00e9 definido n\u00e3o por c\u00f3digo de programa\u00e7\u00e3o, mas por um diagrama (grafo) de conex\u00e3o de fun\u00e7\u00f5es, que podem ser organizadas em qualquer ordem. Essas fun\u00e7\u00f5es s\u00e3o chamadas de filtros.<\/p>\n<p>Essa arquitetura permite implementar a funcionalidade de processamento de m\u00eddia na forma de um conjunto de filtros conectados em um esquema de processamento e transmiss\u00e3o de tr\u00e1fego RTP de um telefone VoIP.<\/p>\n<p>A possibilidade de conectar filtros em esquemas arbitr\u00e1rios, a f\u00e1cil cria\u00e7\u00e3o de novos filtros e a implementa\u00e7\u00e3o do midiastreamer como uma biblioteca separada e aut\u00f4noma permitem us\u00e1-lo tamb\u00e9m em outros projetos. Al\u00e9m disso, o projeto pode pertencer \u00e0 \u00e1rea de VoIP, j\u00e1 que h\u00e1 a possibilidade de adicionar filtros feitos manualmente.<\/p>\n<p>A biblioteca de filtros fornecida por padr\u00e3o \u00e9 bastante rica e, como j\u00e1 mencionado, pode ser expandida com filtros desenvolvidos pelo usu\u00e1rio. Mas, primeiro, vamos descrever os filtros prontos que v\u00eam junto com o midiastreamer. Aqui est\u00e1 a lista deles:<\/p>\n<h3 id=\"zvukovye-filtry\">Filtros de \u00e1udio<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-zvuka\">Captura e reprodu\u00e7\u00e3o de \u00e1udio<\/h4>\n<ul>\n<li>Alsa (Linux): MS_ALSA_WRITE, MS_ALSA_READ<\/li>\n<li>\u00c1udio nativo do Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ<\/li>\n<li>Servi\u00e7o de Fila de \u00c1udio (Mac OS X): MS_AQ_WRITE, MS_AQ_READ<\/li>\n<li>Servi\u00e7o de Unidade de \u00c1udio (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>Reprodutor de arquivos (raw\/wav\/pcap) (Linux): MS_FILE_PLAYER<\/li>\n<li>Reprodutor de arquivos (raw\/wav) (Windows): MS_WINSND_READ<\/li>\n<li>Grava\u00e7\u00e3o em arquivo (wav) (Linux): MS_FILE_REC<\/li>\n<li>Grava\u00e7\u00e3o em arquivo (wav) (Windows): MS_WINSND_WRITE<\/li>\n<li>Unidade de \u00c1udio 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>Som do Windows (Windows)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-zvuka\">Codifica\u00e7\u00e3o\/decodifica\u00e7\u00e3o de \u00e1udio<\/h4>\n<ul>\n<li>G.711 a-law: MS_ALAW_DEC, MS_ALAW_ENC<\/li>\n<li>G.711 \u00b5-law: 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 Linear: MS_L16_ENC, MS_L16_DEC<\/li>\n<li>Speex: MS_SPEEX_ENC, MS_SPEEX_DEC<\/li>\n<\/ul>\n<h4 id=\"obrabotka-zvuka\">Processamento de \u00e1udio<\/h4>\n<ul>\n<li>Convers\u00e3o de canal (mono-&gt;est\u00e9reo, est\u00e9reo-&gt;mono): MS_CHANNEL_ADAPTER<\/li>\n<li>Confer\u00eancia: MS_CONF<\/li>\n<li>Gerador DTMF: MS_DTMF_GEN<\/li>\n<li>Supress\u00e3o de eco (speex): MS_SPEEX_EC<\/li>\n<li>Equalizador: MS_EQUALIZER<\/li>\n<li>Mixer: MS_MIXER<\/li>\n<li>Compensador de perda de pacotes (PLC): MS_GENERIC_PLC<\/li>\n<li>Reamostragem: MS_RESAMPLE<\/li>\n<li>Detector de tons: MS_TONE_DETECTOR<\/li>\n<li>Controle de volume e medi\u00e7\u00e3o de n\u00edvel de sinal: MS_VOLUME<\/li>\n<\/ul>\n<h3 id=\"filtry-video\">Filtros de v\u00eddeo<\/h3>\n<h4 id=\"zahvat-i-vosproizvedenie-video\">Captura e reprodu\u00e7\u00e3o de v\u00eddeo<\/h4>\n<ul>\n<li>Captura Android<\/li>\n<li>Reprodu\u00e7\u00e3o Android<\/li>\n<li>Captura AV Foundation (iOS)<\/li>\n<li>Reprodu\u00e7\u00e3o AV Foundation (iOS)<\/li>\n<li>Captura DirectShow (Windows)<\/li>\n<li>Reprodu\u00e7\u00e3o DrawDib (Windows)<\/li>\n<li>Reprodu\u00e7\u00e3o externa \u2014 Enviar v\u00eddeo para o n\u00edvel superior<\/li>\n<li>Reprodu\u00e7\u00e3o GLX (Linux): MS_GLXVIDEO<\/li>\n<li>Mire \u2014 Imagem em movimento sint\u00e9tica: MS_MIRE<\/li>\n<li>Reprodu\u00e7\u00e3o OpenGL (Mac OS X)<\/li>\n<li>Reprodu\u00e7\u00e3o OpenGL ES2 (Android)<\/li>\n<li>Captura Quicktime (Mac OS X)<\/li>\n<li>Reprodu\u00e7\u00e3o SDL: MS_SDL_OUT<\/li>\n<li>Sa\u00edda de imagens est\u00e1ticas: MS_STATIC_IMAGE<\/li>\n<li>Captura Video For Linux (V4L) (Linux): MS_V4L<\/li>\n<li>Captura Video For Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE<\/li>\n<li>Captura Video4windows (DirectShow) (Windows)<\/li>\n<li>Captura Video4windows (DirectShow) (Windows CE)<\/li>\n<li>Captura Video For Windows (vfw) (Windows)<\/li>\n<li>Reprodu\u00e7\u00e3o XV (Linux)<\/li>\n<\/ul>\n<h4 id=\"kodirovaniedekodirovanie-video\">Codifica\u00e7\u00e3o\/decodifica\u00e7\u00e3o de v\u00eddeo<\/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 (apenas decodificador): 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\">Processamento de v\u00eddeo<\/h4>\n<ul>\n<li>Captura JPEG<\/li>\n<li>Conversor de formato de pixel: MS_PIX_CONV<\/li>\n<li>Redimensionador<\/li>\n<li>Outros filtros<\/li>\n<li>Troca de blocos de dados entre threads: MS_ITC_SOURCE, MS_ITC_SINK<\/li>\n<li>Coleta de blocos de dados de v\u00e1rias entradas para uma sa\u00edda: MS_JOIN<\/li>\n<li>Recep\u00e7\u00e3o\/transmiss\u00e3o RTP: MS_RTP_SEND, MS_RTP_RECV<\/li>\n<li>C\u00f3pia de dados de entrada para v\u00e1rias sa\u00eddas: MS_TEE<\/li>\n<li>Carga consistente: MS_VOID_SINK<\/li>\n<li>Fonte de sil\u00eancio: MS_VOID_SOURCE<\/li>\n<\/ul>\n<h3 id=\"plaginy\">Plugins<\/h3>\n<h4 id=\"zvukovye-filtry-1\">Filtros de \u00e1udio<\/h4>\n<ul>\n<li>Codificador\/decodificador AMR-NB<\/li>\n<li>Codificador\/decodificador G.729<\/li>\n<li>Codificador\/decodificador iLBC<\/li>\n<li>Codificador\/decodificador SILK<br \/>\n<h4 id=\"filtry-video\">Filtros de v\u00eddeo<\/h4>\n<\/li>\n<li>Codificador de software H.264<\/li>\n<li>Codificador\/decodificador H.264 V4L2 com acelera\u00e7\u00e3o de hardware<\/li>\n<\/ul>\n<p>Ap\u00f3s uma breve descri\u00e7\u00e3o do filtro, \u00e9 exibido o nome do tipo utilizado ao criar uma nova inst\u00e2ncia desse filtro. Nas pr\u00f3ximas se\u00e7\u00f5es, nos referiremos a esta lista.<\/p>\n<h2 id=\"ustanovka-pod-linux-ubuntu\">Instala\u00e7\u00e3o no Linux Ubuntu<\/h2>\n<p>Agora, realizaremos a instala\u00e7\u00e3o do mediastreamer no computador e criaremos nosso primeiro aplicativo com ele.<\/p>\n<p>A instala\u00e7\u00e3o do Mediastremer2 em um computador ou m\u00e1quina virtual com Ubuntu n\u00e3o requer habilidades especiais. Aqui e adiante, o s\u00edmbolo &#171;$&#187; ser\u00e1 utilizado para indicar o prompt do shell para a entrada de comandos. Ou seja, se voc\u00ea ver esse s\u00edmbolo no in\u00edcio de uma linha, isso significa que \u00e9 uma linha que mostra os comandos a serem executados no terminal.<\/p>\n<p>Presume-se que, durante a execu\u00e7\u00e3o das a\u00e7\u00f5es descritas neste artigo, seu computador tenha acesso \u00e0 internet.<\/p>\n<h4 id=\"ustanovka-paketa-libmediastremer-dev\">Instala\u00e7\u00e3o do pacote libmediastremer-dev<\/h4>\n<p>Abra o terminal e digite o comando:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get update<\/code><\/pre>\n<p>Ser\u00e1 solicitado a senha para fazer altera\u00e7\u00f5es, digite-a e o gerenciador de pacotes atualizar\u00e1 seus bancos de dados. Ap\u00f3s isso, deve-se executar:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install libmediastreamer-dev<\/code><\/pre>\n<p>Os pacotes de depend\u00eancia necess\u00e1rios e a pr\u00f3pria biblioteca do mediastreamer ser\u00e3o automaticamente baixados e instalados.<\/p>\n<p>O tamanho total dos pacotes deb de depend\u00eancia baixados ser\u00e1 de aproximadamente 35 MB. Detalhes sobre o pacote instalado podem ser obtidos com o comando:<\/p>\n<pre><code class=\"bash\">$ dpkg -s libmediastreamer-dev<\/code><\/pre>\n<p>Exemplo de resposta:<\/p>\n<pre><code class=\"bash\">Package: libmediastreamer-dev\nStatus: install ok installed\nPriority: optional\nSection: libdevel\nInstalled-Size: 244\nMaintainer: Ubuntu Developers \nArchitecture: amd64\nSource: linphone\nVersion: 3.6.1-2.5\nDepends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev\nDescription: Linphone web phone's media library - development files\nLinphone \u00e9 um telefone de \u00e1udio e v\u00eddeo pela internet usando o protocolo SIP. Ele\npossui uma interface GTK+ e console, inclui uma grande variedade de codecs de \u00e1udio e v\u00eddeo\n e fornece recursos de IM.\n.\nEste pacote cont\u00e9m as bibliotecas de desenvolvimento para manipular opera\u00e7\u00f5es de m\u00eddia.\nOriginal-Maintainer: Debian VoIP Team \nHomepage: http:\/\/www.linphone.org\/\n<\/code><\/pre>\n<h4 id=\"ustanovka-instrumentov-razrabotki\">Instala\u00e7\u00e3o das ferramentas de desenvolvimento<\/h4>\n<p>Instalamos o compilador de C e suas ferramentas associadas:<\/p>\n<pre><code class=\"bash\">$ sudo apt-get install gcc<\/code><\/pre>\n<p>Verificamos o resultado, solicitando a vers\u00e3o do compilador:<\/p>\n<pre><code class=\"bash\">$ gcc --version<\/code><\/pre>\n<p>A resposta deve ser aproximadamente assim:<\/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.\nEste \u00e9 um software livre; veja a fonte para condi\u00e7\u00f5es de c\u00f3pia. N\u00e3o h\u00e1\ngarantia; nem mesmo para COMERCIALIZA\u00c7\u00c3O ou ADEQUA\u00c7\u00c3O A UM FIM PARTICULAR.<\/code><\/pre>\n<h4 id=\"sborka-i-zapusk-probnogo-prilozheniya\">Compila\u00e7\u00e3o e execu\u00e7\u00e3o do aplicativo de teste<\/h4>\n<p>Criamos na <em>home<\/em> uma pasta para nossos projetos de aprendizado, chamaremos de <em>mstutorial<\/em>:<\/p>\n<pre><code class=\"bash\">$ mkdir ~\/mstutorial<\/code><\/pre>\n<p>Use seu editor de texto favorito e crie um arquivo de programa C chamado <em>mstest.c<\/em> com o seguinte conte\u00fado:<\/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>Ele inicializa o mediastreamer, imprime uma sauda\u00e7\u00e3o e finaliza a execu\u00e7\u00e3o.<\/p>\n<p>Salve o arquivo e compile o aplicativo de teste com o comando:<\/p>\n<pre><code class=\"bash\">$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>Observe que a linha<\/p>\n<pre><code class=\"bash\">`pkg-config mediastreamer --libs --cflags`<\/code><\/pre>\n<p>\u00e9 colocada entre aspas, que est\u00e3o no teclado no mesmo lugar que a letra &#171;\u0401&#187;.<\/p>\n<p>Se o arquivo n\u00e3o contiver erros, ap\u00f3s a compila\u00e7\u00e3o aparecer\u00e1 um arquivo <em>mstest<\/em>. Execute o programa:<\/p>\n<pre><code class=\"bash\">$ .\/mstest<\/code><\/pre>\n<p>O resultado ser\u00e1 assim:<\/p>\n<pre><code class=\"bash\">ALSA lib conf.c:4738:(snd_config_expand) Par\u00e2metros desconhecidos 0\nALSA lib control.c:954:(snd_ctl_open_noupdate) CTL inv\u00e1lido default:0\nortp-warning - N\u00e3o foi poss\u00edvel conectar o mixer ao cart\u00e3o: Argumento inv\u00e1lido\nALSA lib conf.c:4738:(snd_config_expand) Par\u00e2metros desconhecidos 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconhecido default:0\nALSA lib conf.c:4738:(snd_config_expand) Par\u00e2metros desconhecidos 0\nALSA lib pcm.c:2266:(snd_pcm_open_noupdate) PCM desconhecido default:0\nortp-warning - Estranho, a placa de som HDA Intel PCH n\u00e3o parece ser capaz de nada, tentando novamente com plughw...\nMediastreamer est\u00e1 pronto.<\/code><\/pre>\n<p>Neste trecho vemos mensagens de erro que a biblioteca ALSA gera, que \u00e9 usada para controlar a placa de som. Os pr\u00f3prios desenvolvedores do mediastreamer consideram isso normal. Neste caso, concordaremos com eles.<\/p>\n<p>Agora estamos prontos para trabalhar com o mediastreamer. Instalamos a biblioteca do mediastreamer, a ferramenta de compila\u00e7\u00e3o e, usando o aplicativo de teste, verificamos que as ferramentas est\u00e3o configuradas e o mediastreamer \u00e9 inicializado com sucesso.<\/p>\n<p>Na pr\u00f3xima <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495728\/\">artigo<\/a><\/noindex> vamos criar um aplicativo que compile e execute o processamento de sinais de \u00e1udio em uma cadeia de v\u00e1rios filtros.<\/p>\n<p>Fonte: <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.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\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Explorando o mecanismo VoIP Mediastreamer2. Parte 1 | ProHoster","description":"O material do artigo foi retirado do meu canal no Zen.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/77011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=77011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/77011\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/77012"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=77011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=77011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=77011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}