{"id":79538,"date":"2020-04-28T07:41:57","date_gmt":"2020-04-28T05:41:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10"},"modified":"2020-04-28T07:41:57","modified_gmt":"2020-04-28T05:41:57","slug":"izuchaem-voip-dvizhok-mediastreamer2-chast-10","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10","title":{"rendered":"Uurime VoIP-mootorit Mediastreamer2. 10. osa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"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 <noindex><a rel=\"nofollow\" href=\"https:\/\/zen.yandex.ru\/id\/5e3f8e0751f5346faab4fc7a\" rel=\"nofollow\">\u0434\u0437\u0435\u043d-\u043a\u0430\u043d\u0430\u043b\u0430<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/496874\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a><\/noindex> \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u043e\u0431\u043c\u0435\u043d \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p><\/p>\n<h2 id=\"razrabatyvaem-plagin\">\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0418\u0437\u0443\u0447\u0430\u0435\u043c VoIP-\u0434\u0432\u0438\u0436\u043e\u043a Mediastreamer2. \u0427\u0430\u0441\u0442\u044c 10\" src=\"\/wp-content\/uploads\/2020\/04\/c0382f6d10b9d536ff0b13fde008dbfb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430.<\/p>\n<p><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0432\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>include<\/em> \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u043b\u0430\u0433\u0438\u043d\u0430. \u0412 \u0442\u0435\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443 <em>ms_filter_register()<\/em> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430. \u0412\u0441\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u0430\u043d\u043e\u043d\u0443, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0437\u0443\u0447\u0438\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0430\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u041d\u0410\u0428_\u0424\u0418\u041b\u042c\u0422\u0420 (NASH_FILTR). \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0443\u044e \u0432\u0435\u0449\u044c \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0438 \u043f\u044f\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043e\u0432. \u0410 \u0435\u0449\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043d\u0438\u0436\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430 \u0438 \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u0430, \u043e\u043d \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435. <\/p>\n<p><\/p>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c\/\u0432\u043e\u0441\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u044b. <\/p>\n<p><\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041e\u043d \u0432 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0430\u0439\u043b <em>msfilter.h<\/em>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 MS_FILTER_METHOD \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c), \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c) \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0438\u043f\u0430 <em>MSFilterDesc<\/em> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/* \u0424\u0430\u0439\u043b nash_filter.h, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440-\u0440\u0430\u0437\u0432\u0435\u0442\u0432\u0438\u0442\u0435\u043b\u044c \u0438 \u043d\u043e\u0439\u0437\u0433\u0435\u0439\u0442. *\/\n\n#ifndef myfilter_h\n#define myfilter_h\n\n\/* \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. *\/\n#include &lt;mediastreamer2\/msticker.h&gt;\n\n\/* \n   \u0417\u0430\u0434\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430.  \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e\n   \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432.  \u0412 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435  \u0432 \u0444\u0430\u0439\u043b\u0435 allfilters.h\n   \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 enum MSFilterId. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\n   \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u044d\u0442\u043e\u0442\n   \u0444\u0430\u0439\u043b. \u041d\u043e \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 id \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435\n   \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 4000.  \u0411\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u043d\u0435\n   \u0441\u043a\u043e\u0440\u043e \u0434\u043e\u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430.  \n   *\/\n#define NASH_FILTER_ID 4000\n\n\/* \n   \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0412\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0434\u043e\u043b\u0436\u0435\u043d\n   \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434\u0430, \u0447\u0438\u0441\u043b\u043e \u043e\u0442 0.  \u0422\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u044d\u0442\u043e \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\n   \u043c\u0435\u0442\u043e\u0434\u0430, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0443 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435. \u0423 \u043c\u0435\u0442\u043e\u0434\u043e\u0432\n   \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435. \n   *\/\n#define NASH_FILTER_SET_TRESHOLD MS_FILTER_METHOD(NASH_FILTER_ID , 0, float)\n#define NASH_FILTER_TUNE_OFF     MS_FILTER_METHOD_NO_ARG(NASH_FILTER_ID ,1)\n#define NASH_FILTER_TUNE_ON      MS_FILTER_METHOD_NO_ARG(NASH_FILTER_ID ,2)\n\n\/* \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c. *\/\nstruct _NASHFilterEvent\n{\n    \/* \u042d\u0442\u043e \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u043e\u043b\u044c \u0444\u043b\u0430\u0433\u0430,\n       0 - \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0443\u043b\u0438, 1 - \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b.*\/\n    char state; \n    \/* \u0412\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435. *\/\n    uint64_t time;\n};\ntypedef struct _NASHFilterEvent NASHFilterEvent;\n\n\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430. *\/\n#define NASH_FILTER_EVENT MS_FILTER_EVENT(MS_RTP_RECV_ID, 0, NASHFilterEvent)\n\n\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442\n   \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432. *\/\nextern MSFilterDesc nash_filter_desc;\n\n#endif \/* myfilter_h *\/<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0417\u0430\u0442\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <em>nash_filter_desc<\/em>. \u041a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0434\u043b\u044f &quot;\u0432\u0436\u0438\u0432\u043b\u0435\u043d\u0438\u044f &quot; \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/* \u0424\u0430\u0439\u043b nash_filter.\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440-\u0440\u0430\u0437\u0432\u0435\u0442\u0432\u0438\u0442\u0435\u043b\u044c \u0438 \u043d\u043e\u0439\u0437\u0433\u0435\u0439\u0442. *\/\n\n#include &quot;nash_filter.h&quot;\n#include &lt;math.h&gt;\n\n#define NASH_FILTER_NOUTPUTS 5\n\n\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. *\/\ntypedef struct _nash_filterData\n{\n    bool_t disable_out;  \/* \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434. *\/\n    int last_state;   \/* \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f. *\/\n    char zero_count;     \/* \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. *\/\n    char lag;            \/* \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u043e\u0439\u0437\u0433\u0435\u0439\u0442\u043e\u043c. *\/\n    char n_count;        \/* \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u041d\u0415\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. *\/\n    float skz_level;     \/* \u0421\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438\n\u0431\u043b\u043e\u043a\u0430, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b. \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0433\n\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435.  *\/\n\n} nash_filterData;\n\n\/*----------------------------------------------------------*\/\n\/* \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. *\/\nstatic void nash_filter_init(MSFilter *f)\n{\n    nash_filterData *d=ms_new0(nash_filterData, 1);\n    d-&gt;lag=5;\n    f-&gt;data=d;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0430,\n   \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c. *\/\nstatic void nash_filter_uninit(MSFilter *f)\n{\n    ms_free(f-&gt;data);\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u043d\u0443\u043b\u044f\u043c\u0438, \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e\n   \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0447\u0435\u043c \u0431\u043b\u043e\u043a. *\/\nchar zero_array[1024]={0};\n\n\/* \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. *\/\nNASHFilterEvent event;\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. *\/\nstatic void send_event(MSFilter *f, int state)\n{\n    nash_filterData *d =( nash_filterData* ) f-&gt;data;\n     d-&gt;last_state = state;\n    \/* \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f,\n       \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0438\u043a\u0430. \u0412\u0440\u0435\u043c\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445. *\/\n    event.time=f -&gt; ticker -&gt; time;\n    event.state=state;  \n    ms_filter_notify(f, NASH_FILTER_EVENT, &amp;event);\n}   \n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 (\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438\n  \u0431\u043b\u043e\u043a\u0430. *\/\nstatic float calc_skz(nash_filterData *d, int16_t *signal, int numsamples)\n{\n    int i;\n    float acc = 0;\n    for (i=0; i&lt;numsamples; i++)\n    {\n        int s=signal[i];\n        acc = acc + s * s;\n    }\n    float skz = (float)sqrt(acc \/ numsamples);\n    return skz;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430,\n   \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0438\u043a\u043e\u043c. *\/\nstatic void nash_filter_process(MSFilter *f)\n{\n    nash_filterData *d=(nash_filterData*)f-&gt;data;\n\n    \/* \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445. *\/\n    mblk_t *im;\n    int i;\n    int state;\n    \/* \u0412\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n       \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0435\u0451 \u043e\u043f\u0443\u0441\u0442\u043e\u0448\u0435\u043d\u0438\u044f. *\/\n    while((im=ms_queue_get(f-&gt;inputs[0]))!=NULL)\n    {\n        \/* \u0415\u0441\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u044b \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. *\/\n        if ( d -&gt; disable_out)\n        {\n          freemsg(im);\n          continue;\n        }\n\n        \/* \u0418\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430. *\/\n        float skz = calc_skz(d, (int16_t*)im-&gt;b_rptr, msgdsize(im));\n        state = (skz &gt; d-&gt;skz_level) ? 1 : 0; \n        if (state) \n        {\n            d-&gt;n_count++;\n            d-&gt;zero_count = 0;\n        }\n        else\n        {\n            d-&gt;n_count = 0;\n            d-&gt;zero_count++;\n        }\n        if (((d-&gt;zero_count &gt; d-&gt;lag) || (d-&gt;n_count &gt; d-&gt;lag))\n            &amp;&amp;  (d-&gt;last_state != state)) send_event(f, state);\n\n        \/* \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u043e \u0432\u044b\u0445\u043e\u0434\u0430\u043c. \u041d\u043e\n         * \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0435\u043c, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n         * \u0443\u0439\u0434\u0435\u0442 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 0, \u0430 \u0435\u0433\u043e \u043a\u043e\u043f\u0438\u0438 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435\n         * \u0432\u044b\u0445\u043e\u0434\u044b. *\/ \n        int output_count = 0;\n        mblk_t *outm; \/* \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. *\/\n        for(i=0; i &lt; f-&gt;desc-&gt;noutputs; i++)\n        {\n            if (f-&gt;outputs[i]!=NULL)\n            {\n                if (output_count == 0)\n                {\n                    outm = im;\n                }\n                else\n                {\n                    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0435\u0433\u043a\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. *\/       \n                    outm = dupmsg(im);\n                }\n                \/* \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0438\u043b\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439\n                 * \u0432\u044b\u0445\u043e\u0434 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. *\/ \n                ms_queue_put(f-&gt;outputs[i], outm);\n                output_count++;\n            }\n        }\n    }\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 NASH_FILTER_SET_LAG. *\/\nstatic int nash_filter_set_treshold(MSFilter *f, void *arg)\n{\n    nash_filterData *d=(nash_filterData*)f-&gt;data;\n    d-&gt;skz_level=*(float*)arg;\n    return 0;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 NASH_FILTER_TUNE_OFF. *\/\nstatic int nash_filter_tune_off(MSFilter *f, void *arg)\n{\n    nash_filterData *d=(nash_filterData*)f-&gt;data;\n    d-&gt;disable_out=TRUE;\n    return 0;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 NASH_FILTER_TUNE_ON. *\/\nstatic int nash_filter_tune_on(MSFilter *f, void *arg)\n{\n    nash_filterData *d=(nash_filterData*)f-&gt;data;\n    d-&gt;disable_out=FALSE;\n    return 0;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0430, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432\n   \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445\n   \u0441\u0442\u0440\u043e\u043a. *\/\nstatic MSFilterMethod nash_filter_methods[]={\n    { NASH_FILTER_SET_TRESHOLD, nash_filter_set_treshold },\n    { NASH_FILTER_TUNE_OFF, nash_filter_tune_off },\n    { NASH_FILTER_TUNE_ON, nash_filter_tune_on },\n    { 0 , NULL } \/* \u041c\u0430\u0440\u043a\u0435\u0440 \u043a\u043e\u043d\u0446\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. *\/\n};\n\n\/*----------------------------------------------------------*\/\n\/* \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0434\u043b\u044f \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430. *\/\nMSFilterDesc nash_filter_desc=\n{\n    NASH_FILTER_ID,\n    &quot;NASH_FILTER&quot;,\n    &quot;A filter with noise gate that reads from input and copy to it's five outputs.&quot;,\n    MS_FILTER_OTHER,\n    NULL,\n    1,\n    NASH_FILTER_NOUTPUTS,\n    nash_filter_init,\n    NULL,\n    nash_filter_process,\n    NULL,\n    nash_filter_uninit,\n    nash_filter_methods\n};\n\nMS_FILTER_DESC_EXPORT(nash_filter_desc)\n<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043d\u0435 \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u0432 \u0434\u043e\u043b\u0433\u0438\u0439 \u044f\u0449\u0438\u043a, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0430 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0441\u0445\u0435\u043c\u0430 \u0432\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<br \/>\n\u041d\u0430\u0448 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043f\u043e-\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u043c\u0443 \u044f\u0440\u043a\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043d\u0430\u0448 \u0444\u0438\u043b\u044c\u0442\u0440.<\/p>\n<p><\/p>\n<p>\u0412 \u0441\u0445\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0432 \u0444\u0430\u0439\u043b \u0444\u043e\u0440\u043c\u0430\u0442\u0430 wav. \u041f\u043e \u0437\u0430\u043c\u044b\u0441\u043b\u0443, \u043d\u0430\u0448 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b \u043f\u0430\u0443\u0437\u044b \u0432 \u0440\u0435\u0447\u0438. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440.<br \/>\n\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442. \u0415\u0441\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u043b\u0430\u0433 &quot;0&quot;, \u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0434\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &quot;1&quot; \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p><\/p>\n<p>\u041a \u043f\u0440\u0435\u0436\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0435\u0449\u0435 \u0434\u0432\u0430: <code>--ng<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0440\u043e\u0433\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0438 <code>--rec<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <em>record.wav<\/em>.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/* \u0424\u0430\u0439\u043b mstest9.c \u0418\u043c\u0438\u0442\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0438\n * \u043d\u043e\u0439\u0437\u0433\u0435\u0439\u0442\u043e\u043c. *\/\n\n#include &lt;mediastreamer2\/mssndcard.h&gt;\n#include &lt;mediastreamer2\/dtmfgen.h&gt;\n#include &lt;mediastreamer2\/msrtp.h&gt;\n#include &lt;mediastreamer2\/msfilerec.h&gt;\n\n\/* \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u0438\u043b\u044c\u0442\u0440. *\/\n#include &quot;nash_filter.h&quot;\n\n\/* \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. *\/\n#include &quot;mstest_common.c&quot;\n\n\/*----------------------------------------------------------*\/\nstruct _app_vars\n{\n    int  local_port;              \/* \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442. *\/\n    int  remote_port;             \/* \u041f\u043e\u0440\u0442 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. *\/\n    char remote_addr[128];        \/* IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. *\/\n    MSDtmfGenCustomTone dtmf_cfg; \/* \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430. *\/\n    MSFilter* recorder;           \/* \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440. *\/\n    bool_t file_is_open;          \/* \u0424\u043b\u0430\u0433 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043a\u0440\u044b\u0442. *\/\n    \/* \u041f\u043e\u0440\u043e\u0433, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 \u0444\u0430\u0439\u043b. *\/\n    float treshold; \n    bool_t en_rec;                \/*\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b.*\/    \n};\n\ntypedef struct _app_vars app_vars;\n\n\/*----------------------------------------------------------*\/\n\/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. *\/\nRtpSession* create_duplex_rtp_session(app_vars v)\n{\n    RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1,\n            FALSE, RTP_SESSION_SENDRECV);\n    rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port,\n            v.remote_port + 1);\n    rtp_session_set_send_payload_type(session, PCMU);\n    return session;\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \n * \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. *\/\nvoid  scan_args(int argc, char *argv[], app_vars *v)\n{\n    char i;\n    for (i=0; i&lt;argc; i++)\n    {\n        if (!strcmp(argv[i], &quot;--help&quot;))\n        {\n            char *p=argv[0]; p=p + 2;\n            printf(&quot;  %s walkie talkienn&quot;, p);\n            printf(&quot;--help      List of options.n&quot;);\n            printf(&quot;--version   Version of application.n&quot;);\n            printf(&quot;--addr      Remote abonent IP address string.n&quot;);\n            printf(&quot;--port      Remote abonent port number.n&quot;);\n            printf(&quot;--lport     Local port number.n&quot;);\n            printf(&quot;--gen       Generator frequency.n&quot;);\n            printf(&quot;--ng        Noise gate treshold level from 0. to 1.0n&quot;);\n            printf(&quot;--rec       record to file 'record.wav'.n&quot;);\n            exit(0);\n        }\n\n        if (!strcmp(argv[i], &quot;--version&quot;))\n        {\n            printf(&quot;0.1n&quot;);\n            exit(0);\n        }\n\n        if (!strcmp(argv[i], &quot;--addr&quot;))\n        {\n            strncpy(v-&gt;remote_addr, argv[i+1], 16);\n            v-&gt;remote_addr[16]=0;\n            printf(&quot;remote addr: %sn&quot;, v-&gt;remote_addr);\n        }\n\n        if (!strcmp(argv[i], &quot;--port&quot;))\n        {\n            v-&gt;remote_port=atoi(argv[i+1]);\n            printf(&quot;remote port: %in&quot;, v-&gt;remote_port);\n        }\n\n        if (!strcmp(argv[i], &quot;--lport&quot;))\n        {\n            v-&gt;local_port=atoi(argv[i+1]);\n            printf(&quot;local port : %in&quot;, v-&gt;local_port);\n        }\n\n        if (!strcmp(argv[i], &quot;--gen&quot;))\n        {\n            v -&gt; dtmf_cfg.frequencies[0] = atoi(argv[i+1]);\n            printf(&quot;gen freq : %in&quot;, v -&gt; dtmf_cfg.frequencies[0]);\n        }\n\n        if (!strcmp(argv[i], &quot;--ng&quot;))\n        {\n            v -&gt; dtmf_cfg.frequencies[0] = atoi(argv[i+1]);\n            printf(&quot;noise gate treshold: %fn&quot;, v -&gt; treshold);\n        }\n         if (!strcmp(argv[i], &quot;--rec&quot;))\n        {\n            v -&gt; en_rec = TRUE;\n            printf(&quot;enable recording: %in&quot;, v -&gt; en_rec);\n        }\n    }\n}\n\n\/*----------------------------------------------------------*\/\n\/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\n * \u0437\u0430\u043c\u0435\u0442\u0438\u0442, \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u0430 \u0442\u0438\u0448\u0438\u043d\u0430 \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0442\u0438\u0448\u0438\u043d\u0430 \u0441\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0437\u0432\u0443\u043a\u0430\u043c\u0438. *\/\nstatic void change_detected_cb(void *data, MSFilter *f, unsigned int event_id,\n        NASHFilterEvent *ev)\n{\n    app_vars *vars = (app_vars*) data;\n\n    \/* \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043c. *\/\n    if (! vars -&gt; en_rec) return; \n\n    if (ev -&gt; state)\n    {\n        \/* \u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c. *\/\n        if(!vars-&gt;file_is_open)\n        {\n            ms_filter_call_method(vars-&gt;recorder, MS_FILE_REC_OPEN, &quot;record.wav&quot;);\n            vars-&gt;file_is_open = 1;\n        }\n        ms_filter_call_method(vars-&gt;recorder, MS_FILE_REC_START, 0);\n        printf(&quot;Recording...n&quot;);\n    }\n    else\n    {\n        \/* \u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c. *\/\n        ms_filter_call_method(vars-&gt;recorder, MS_FILE_REC_STOP, 0);\n        printf(&quot;Pause...n&quot;);\n    }\n}\n\n\/*----------------------------------------------------------*\/\nint main(int argc, char *argv[])\n{\n    \/* \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. *\/\n    app_vars vars={5004, 7010, &quot;127.0.0.1&quot;, {0}, 0, 0, 0.01, 0};\n\n    \/* \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \n     * \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. *\/\n    scan_args(argc, argv, &amp;vars);\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 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u043a\u0442\u0430. *\/\n    MSSndCard *snd_card =\n        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());\n    MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);\n    MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);\n    MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u043a\u043e\u0434\u0435\u0440\u0430. *\/\n    MSFilter *encoder = ms_filter_create_encoder(&quot;PCMU&quot;);\n\n    \/* \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043f\u044b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. *\/\n    register_payloads();\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. *\/\n    RtpSession* rtp_session = create_duplex_rtp_session(vars);\n    ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);\n\n    \/* \u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430. *\/\n    ms_filter_link(snd_card_read, 0, dtmfgen, 0);\n    ms_filter_link(dtmfgen, 0, encoder, 0);\n    ms_filter_link(encoder, 0, rtpsend, 0);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0440\u0438\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u043a\u0442\u0430. *\/\n    MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);\n    ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430. *\/\n    MSFilter *decoder=ms_filter_create_decoder(&quot;PCMU&quot;);\n    \/\/MS_FILE_REC_ID\n\n    \/* \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0444\u0438\u043b\u044c\u0442\u0440. *\/\n    ms_filter_register(&amp;nash_filter_desc);\n    MSFilter *nash = ms_filter_new(NASH_FILTER_ID);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b. *\/\n    MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);\n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. *\/\n    MSFilter *recorder=ms_filter_new(MS_FILE_REC_ID);\n    vars.recorder = recorder; \n\n    \/* \u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u0440\u0438\u0451\u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u043a\u0442\u0430. *\/\n    ms_filter_link(rtprecv, 0, decoder, 0);\n    ms_filter_link(decoder, 0, nash, 0);\n    ms_filter_link(nash, 0, snd_card_write, 0);\n    ms_filter_link(nash, 1, recorder, 0);\n\n    \/* \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u0444\u0438\u043b\u044c\u0442\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u0439 \u0432\n     * \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438\n     * \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0435\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\n     * \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. *\/\n    ms_filter_set_notify_callback(nash,\n            (MSFilterNotifyFunc)change_detected_cb, &amp;vars);\n    ms_filter_call_method(nash,NASH_FILTER_SET_TRESHOLD, &amp;vars.treshold); \n\n    \/* \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0430\u043a\u0442\u043e\u0432 - \u0442\u0438\u043a\u0435\u0440. *\/\n    MSTicker *ticker = ms_ticker_new();\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, snd_card_read);\n    ms_ticker_attach(ticker, rtprecv);\n\n    \/* \u0415\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0430 \u043e\u0442 \u043d\u0443\u043b\u044f, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. *\/   \n    if (vars.dtmf_cfg.frequencies[0])\n    {\n        \/* \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430. *\/\n        vars.dtmf_cfg.duration = 10000;\n        vars.dtmf_cfg.amplitude = 1.0;\n    }\n\n    \/* \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c \u0446\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430. *\/\n    printf(&quot;Press ENTER to exit.n &quot;);\n    char c=getchar();\n    while(c != 'n')\n    {\n        if(vars.dtmf_cfg.frequencies[0])\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            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,\n                    (void*)&amp;vars.dtmf_cfg);\n        }\n        char c=getchar();\n        printf(&quot;--n&quot;);\n    }\n    if (vars.en_rec ) ms_filter_call_method(recorder, MS_FILE_REC_CLOSE, 0);\n}\n<\/code><\/pre>\n<p><\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <em>math<\/em>, \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0430\u0441\u044c, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ gcc mstest9.c nash_filter.c -o mstest9   `pkg-config mediastreamer   --libs --cflags`  -lm<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e, \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ .\/mstest9  --lport 7010  --port 8010 --addr &lt;\u0442\u0443\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430&gt; --rec<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ .\/mstest9  --lport 8010  --port 7010 --addr &lt;\u0442\u0443\u0442 \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430&gt;<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0430\u0447\u043d\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u044b \u0441\u043a\u0430\u0436\u0435\u0442\u0435 \u0432 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u043e\u0432\u043e &quot;<em>Recording&#8230;<\/em>&quot;. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0437\u0430\u043c\u043e\u043b\u0447\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f &quot;<em>Pause&#8230;<\/em>&quot;. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0440\u043e\u0433\u0430. <\/p>\n<p><\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b. \u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 nash_filter_process() \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0447\u0435\u0431\u043d\u044b\u0439, \u0442\u043e \u0442\u0430\u043c \u0431\u044b\u043b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u043c \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499010\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a><\/noindex> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u0427\u0442\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497932\/\">habr.com<\/a> <\/p>\n","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 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u043e\u0431\u043c\u0435\u043d \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79539,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - 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. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u043e\u0431\u043c\u0435\u043d \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\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\/et\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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 10 | 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. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u043e\u0431\u043c\u0435\u043d \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10\" \/>\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-28T05:41:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-28T05:41:57+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\udd47Tutvume VoIP-mootoriga Mediastreamer2. Osa 10 | ProHoster","description":"Artikli materjal on saadud minu Zen-kanalist. Eelmisel artiklis l\u00f5ime duplex-k\u00f5ne seadme, mis vahetab helisignaale duplex RTP-seansis. Selles artiklis \u00f5pime kirjutama filtreid ja lisame ise tehtud filtri meie ise valmistatud k\u00f5ne seadmesse. Arendame pluginaid. M ediastrimmeris, nagu paljudes teistes programmides, kasutatakse pluginaid funktsionaalsuse laiendamiseks.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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 10 | 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. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0435 \u043e\u0431\u043c\u0435\u043d \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0443\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e RTP-\u0441\u0435\u0441\u0441\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u0432\u043e\u0440\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043c\u0435\u0434\u0438\u0430\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/izuchaem-voip-dvizhok-mediastreamer2-chast-10","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-28T05:41:57+00:00","article:modified_time":"2020-04-28T05:41:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79538","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 16:36:31","updated":"2022-09-30 09:23:20"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=79538"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79538\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/79539"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=79538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=79538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=79538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}