áá±á¬ááºážáá«ážá á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá»áœááºá¯ááºáá¶á០áá°áá«áááºá
Duplex á¡ááºáá¬ááœááº
áá±á¬ááºáá¯á¶ážá
áá¯á¶ááŒááºážááᯠáá±á«ááºážá ááºáá¯á¶ááœáẠááŒáá¬ážáááºá ááá¬áá»á¬ážá á¡á±á¬ááºááœááºážáááºááẠá¡áá¶áááºá០á áááºááá·áº áá®áá¬áááºážááŒá±á¬ááºážááᯠáá¯á¶áá±á¬áºáááºá áááºážááẠááá¯ááºáááá¯áá¯ááºážá០á¡áá»ááºááŒááá°áá¬áá»á¬ážááᯠáá±ážáá±á¬ááºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áááºážááẠáá áºá áá¹ááá·áºáá»áŸáẠááá°áᬠáááá ááŸá¯ááºážááŒáá·áº ááŒá áºáá±á«áºáááºá media streamer audio filters áá»á¬ážá¡áá¯á¶ážááŒá¯áá±á¬ data bit depth ááẠ8000 bits (áá«á á¡áá±ážáááŒá®ážáá«áá°áž; ááá¹áááŸááá«áá áááºááẠááá¯ááá¯ááŒáá·áºáá¬ážáá±á¬ bit depth ááŒáá·áº á¡áá¯ááºáá¯ááºááá·áº filter áá»á¬ážááᯠáá±ážááá¯ááºáááº)á áá±áá¬ááᯠááá°áᬠ16 áá¯á¶ážááŒáá·áº á¡á¯ááºá á¯ááœá²á·áá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº ááá±á¬ááºáá áºáá¯á á®ááẠ160 bytes á¡ááœááºá¡á á¬ážááŸááááºá ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬ááᯠááááºááá¯ááºáá±á¬á¡áá«ááœáẠâáá±á¬ááºááœááºážááŒááºááá¯ááºáááºâ áá°áá±á¬ áá»ááºááá±áá¬á á¡áááºááá¯á· áá±áá¬ááᯠáá»áœá±ážáá«áááºá á¡ááŸá¬ážááŸá¬ááŒááºáá±á ááºááœáẠáááºááẠááá¯ááºáááá¯áá¯ááºážááá¯á· á áá¬ážááŒá±á¬ááẠááŒá®ážááœá±á·áá¬áá±á¬á¡áá«ááœáẠáááºážááᯠááá·áºááœááºážáá¬ážááẠ- áááºááẠáááºážááŒá±á¬ááºážááᯠá¡áá¶á¡áá»ááºááŒááá·áºá áá áºááŒáá·áº âáá áºáááºáááºâ áá®ážá ááºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá»ááºááá±áá¬ááŒá®ážáá±á¬ááºá á¡áá»ááºááŒááŸá¯ááẠµ-law (G.16 á á¶ááŸá¯ááºáž) á¡á áá»áœááºá¯ááºááá¯á·á 711-áá áºááá°áá¬áá»á¬ážááᯠááŸá áºáá áºáá»á¬ážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá±ážááá·áº áá¯ááºáá«ááá¯á· á¡áá»ááºááŒáááºá áá¯ááºááŒá±á¬ááºážáááááá¬á á¡ááœááºááœááºá áá»áœááºá¯ááºááá¯á·ááœáẠá¡ááœááºá¡á á¬áž áááºáááºááŸááá±á¬ áá±áá¬ááá±á¬ááºáá áºáᯠááŸáááŸáá·áºááŒá®ážááŒá áºáááºá áá±áá¯áá»á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœá¬ážá¡áá¬ááᯠáá»áœá±áá¬áááºáááá¯á¡ááºáá«á áá±áá¬áá»á¬ážááᯠáá»á¯á¶á·ááŒááºážáááŸááá² ááá¯á·ááœáŸááºááá¯ááºáááºá ááá¯á·áá±á¬áº Wireshark ááẠµ-law ááá¯á·ááá¯áẠa-law á¡á áá»á¯á¶á·áá¬ážááá·áºá¡áá«ááœááºáᬠWireshark ááẠRTP ááá¯ááºááá¯ááºáá¯ááºááœáŸáá·áºááŸá¯á០á¡áá¶ááᯠááŒááºáááºáá¯ááºáá±ážááá¯ááºáá±á¬ááŒá±á¬áá·áº á€áá±áá¬ááœáẠáá¯ááºáá«áá áºáá¯á¡áá¯á¶ážááŒá¯ááẠá¡áá¯á¶ážáááºáá«áááºá
áá¯ááºááŒá±á¬ááºážááŒá®ážáá±á¬ááºá áá±á«á·áá«ážáá±á¬áá±áá¬ááá±á¬ááºáá»á¬ážááᯠrtpsend á á áºáá¯ááºááŸá¯ááá¯á· áá±ážááá¯á·áááºááŒá áºááŒá®áž áááºážááá¯á·ááᯠRTP áááºáá±á·áá»áºáá áºáá¯ááœáẠááá·áºááœááºážáᬠááá¯á¡ááºáá±á¬á¡áá¶áá»á¬ážááᯠáááºááŸááºáᬠUDP áááºáááºáá¯á¶á á¶ááŒáá·áº ááœááºáááºááŸáá áºááá·áº áá¯ááºááœáŸáá·áºáááºá¡ááœáẠáá®áá®áá¬áá¯ááºááœáŸáá·áºáá°áᶠáá±ážá¡ááºáááºááŒá áºáááºá
á á áºáá¯ááºááŸá¯áá»á¬ážáá¡áá±á«áºááá¯ááºážááœááºážáááºááẠáááºáá¶áááºážááŒá±á¬ááºážááá¯ááœá²á·á ááºážáááºá ááœááºáááºááŸáá®áá®áá¬áá¯ááºááœáŸáá·áºáá°ááŸáááŸááá±á¬ RTP áááºáá±á·áá»á¬ážááẠáá±áá¬ááá±á¬ááºáá¯á¶á á¶ááŒáá·áº áááºážááá¯á·áá±á«áºáá¬ááá·áºá¡ááœááºááœáẠrtprecv á á áºáá¯ááºááŸá¯ááá¯á·áááºáá±á¬ááºáááºá áááºážááá¯á·áá áºáá¯á á®ááẠáááºáá¶áááŸááá¬ážáá±á¬áááºáááºáá áºáá¯ááŸáá·áºáááºááá¯ááºááá·áºá¡ááœááºááœáẠrtprecv á á áºáá¯ááºááŸá¯ááá¯ááá·áºááœááºážáááºá ááá±á¬ááºááœáẠpayload data áá¬áá«áááºáááºá ááááºáá±á¬ááºážáá«ážááœáẠáá¯á¶ááœáẠá¡á áááºážáá±á¬ááºááŒáá·áº ááŒáá¬ážáááºá
ááá¯á·áá±á¬ááºá ááá±á¬ááºáá»á¬ážááᯠáá¯ááºáá« á á áºáá¯ááºááŒááºážááá¯á· ááá¯á·ááŒá®ážá áááºážááá¯á·ááœááºáá«ááŸááá±á¬ single-byte ááá°áá¬áá»á¬ážááᯠlineará 16-bit áá»á¬ážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá±ážáá«áááºá áááºážááᯠáá®áá®áá¬áá¯ááºááœáŸáá·áºáá° á á áºáá¯ááºááŸá¯áá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºááŒá®ážááŒá áºáááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááá·áºáá¬ážááŒááºáá áá®áá¬ááœáẠááŒááºááœáá·áºáááºá¡ááœáẠáááºážááá¯á·ááᯠá¡áá¶áááºááá¯á· ááá¯á·áá±ážáá«áááºá
á¡áᯠsoftware á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá® áááºááœá¬ážáá¡á±á¬ááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠááááºá áá»áœááºá¯ááºááá¯á·ááœá²áá¯ááºáá¬ážááá·áº áááºáá¶áááááá¬ááŸáá·áº áá¯ááºááœáŸáá·áºááá·áºááá¯ááºáá»á¬ážááᯠáá±á«ááºážá ááºáááºááŒá áºáááºá áááºážáááá¯ááºáá®ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááááºáááºážáá»á¬ážááŸáá·áº ááááºá á¬áá»á¬ážá¡ááœáẠáá¯á¶áá±áááºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá²á·áá±á¬áºáááºáž ááá¯á¡áá« á áááºáá»áááºááœáẠáá»áœááºá¯ááºááá¯á·áááºááŸááºáá¬ážááá·áº áááºáááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºááẠáááá¯ááááºááᯠááá¯á¡ááºáá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠcommand line arguments áá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠáá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠáá±á«ááºážááá·áºáááºááŒá áºáááºá ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠáá»áááºáááºááŸá¯áá áºáá¯ááᯠáá°áá±á¬ááºááá¯áá±á¬ intercom á IP ááááºá á¬ááŸáá·áº ááááºáááºážááᯠáááºááŸááºááá¯ááºáá«áááºá
ááááŠážá áœá¬á áááºážááááºáááºáá»á¬ážááᯠááááºážáááºážááá·áº áááá¯ááááºááœáẠááœá²á·á ááºážáá¯á¶áá áºáá¯ááᯠááá·áºááŒáá«á áá¯á·á
struct _app_vars
{
int local_port; /* ÐПкалÑÐœÑй пПÑÑ. */
int remote_port; /* ÐПÑÑ Ð¿ÐµÑегПвПÑМПгП ÑÑÑÑПйÑÑва Ма ÑЎалеММПЌ кПЌпÑÑÑеÑе. */
char remote_addr[128]; /* IP-аЎÑÐµÑ ÑЎалеММПгП кПЌпÑÑÑеÑа. */
MSDtmfGenCustomTone dtmf_cfg; /* ÐаÑÑÑПйкО ÑеÑÑПвПгП ÑОгМала геМеÑаÑПÑа. */
};
typedef struct _app_vars app_vars;
áááá¯ááááºááẠvars áá¯áá±á«áºáá±á¬ á€á¡áá»áá¯ážá¡á
á¬ážá ááœá²á·á
ááºážáá¯á¶ááᯠááŒá±áá¬áááºááŒá
áºáááºá
ááá¯á·áá±á¬ááºá command line arguments áá»á¬ážááá¯ááœá²ááŒááºážá
áááºááŒá¬ááẠfunction áá
áºáá¯ááá·áºááŒáá«á
áá¯á·á
/* ЀÑМкÑÐžÑ Ð¿ÑеПбÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÑ Ð°ÑгÑЌеМÑПв кПЌаМЎМПй ÑÑÑПкО в
* МаÑÑÑПйкО пÑПгÑаЌЌÑ. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
ááœá²ááŒááºážá áááºááŒá¬ááŒááºážáááááºá¡áá±ááŒáá·áºá command line arguments áá»á¬ážááᯠvars áááºáá±á¬ááºááŸá¯ááááºáááºáá»á¬ážááœáẠáá¬ážááŸááááºááŒá áºáááºá á¡ááá®áá±ážááŸááºážáá¡ááááá¯ááºáá±á¬ááºáá»ááºááŸá¬ filter áá»á¬ážááŸáá¯ááºááœáŸáá·áºááŒááºážááŸáá·áºáááºáá¶ááŒááºážáááºážááŒá±á¬ááºážáá»á¬ážááá¯á á¯áá±á¬ááºážáááºááŒá áºáááº; ticker ááá¯áá»áááºáááºááŒá®ážáá±á¬ááºááááºážáá»á¯ááºááŸá¯á¡á¬áž generator frequency ááᯠáá¯áááá¯ááºáá¯áááºááŸááºáá¬ážáá«á á ááºážáááºáá®ážá ááºááá¯ááŒááºáááºá áááºáááºááŒá áºááẠá ááááºáá² á¡áá¯ááºáá¯ááºáááºá
áá»ááºááá±áá¬ááẠáááºážá áá®ááá¯ááºážááŒá±á¬áá·áº á€ááŒááºáááºá áááºááẠááá¯á¡ááºáááá·áºáááºá á¡ááŒá±á¬ááºážáá áºáá¯áá¯ááŒá±á¬áá·áº áááºážááẠ16 á áá¹ááá·áºááẠááá¯ááŒá¬ááá·áº á¡áá»ááºááŒááŸá¯ááᯠááá¯ááºáá±ážááá¯ááºáá«á áááºážáááŒá¬áá»áááºááᯠ32-bit áá¶áá«ááºááŒáá·áº áááºááŸááºáá¬ážááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá
áááá¯ááááºáá áºáá¯áá¯á¶ážááẠá€áá²á·ááá¯á·ááŒá áºáááá·áºáááº-
/* Ѐайл mstest8.c ÐЌОÑаÑÐŸÑ Ð¿ÐµÑегПвПÑМПгП ÑÑÑÑПйÑÑва. */
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
/* ÐПЎклÑÑаеЌ Ñайл ПбÑОÑ
ÑÑМкÑОй. */
#include "mstest_common.c"
/*----------------------------------------------------------*/
struct _app_vars
{
int local_port; /* ÐПкалÑÐœÑй пПÑÑ. */
int remote_port; /* ÐПÑÑ Ð¿ÐµÑегПвПÑМПгП ÑÑÑÑПйÑÑва Ма ÑЎалеММПЌ кПЌпÑÑÑеÑе. */
char remote_addr[128]; /* IP-аЎÑÐµÑ ÑЎалеММПгП кПЌпÑÑÑеÑа. */
MSDtmfGenCustomTone dtmf_cfg; /* ÐаÑÑÑПйкО ÑеÑÑПвПгП ÑОгМала геМеÑаÑПÑа. */
};
typedef struct _app_vars app_vars;
/*----------------------------------------------------------*/
/* СПзЎаеЌ ÐŽÑплекÑÐœÑÑ RTP-ÑеÑÑОÑ. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
rtp_session_set_send_payload_type(session, PCMU);
return session;
}
/*----------------------------------------------------------*/
/* ЀÑМкÑÐžÑ Ð¿ÑеПбÑÐ°Ð·ÐŸÐ²Ð°ÐœÐžÑ Ð°ÑгÑЌеМÑПв кПЌаМЎМПй ÑÑÑПкО в
* МаÑÑÑПйкО пÑПгÑаЌЌÑ. */
void scan_args(int argc, char *argv[], app_vars *v)
{
char i;
for (i=0; i<argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
char *p=argv[0]; p=p + 2;
printf(" %s walkie talkienn", p);
printf("--help List of options.n");
printf("--version Version of application.n");
printf("--addr Remote abonent IP address string.n");
printf("--port Remote abonent port number.n");
printf("--lport Local port number.n");
printf("--gen Generator frequency.n");
exit(0);
}
if (!strcmp(argv[i], "--version"))
{
printf("0.1n");
exit(0);
}
if (!strcmp(argv[i], "--addr"))
{
strncpy(v->remote_addr, argv[i+1], 16);
v->remote_addr[16]=0;
printf("remote addr: %sn", v->remote_addr);
}
if (!strcmp(argv[i], "--port"))
{
v->remote_port=atoi(argv[i+1]);
printf("remote port: %in", v->remote_port);
}
if (!strcmp(argv[i], "--lport"))
{
v->local_port=atoi(argv[i+1]);
printf("local port : %in", v->local_port);
}
if (!strcmp(argv[i], "--gen"))
{
v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
}
}
}
/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
/* УÑÑаМавлОваеЌ МаÑÑÑПйкО пП ÑЌПлÑаМОÑ. */
app_vars vars={5004, 7010, "127.0.0.1", {0}};
/* УÑÑаМавлОваеЌ МаÑÑÑПйкО МаÑÑÑПйкО пÑПгÑÐ°ÐŒÐŒÑ Ð²
* ÑППÑвеÑÑÑвОО Ñ Ð°ÑгÑЌеМÑаЌО кПЌаМЎМПй ÑÑÑПкО. */
scan_args(argc, argv, &vars);
ms_init();
/* СПзЎаеЌ ÑкзеЌплÑÑÑ ÑОлÑÑÑПв пеÑеЎаÑÑегП ÑÑакÑа. */
MSSndCard *snd_card =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
/* СПзЎаеЌ ÑОлÑÑÑ ÐºÐŸÐŽÐµÑа. */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
/* РегОÑÑÑОÑÑеЌ ÑÐžÐ¿Ñ ÐœÐ°Ð³ÑÑзкО. */
register_payloads();
/* СПзЎаеЌ ÐŽÑплекÑÐœÑÑ RTP-ÑеÑÑОÑ. */
RtpSession* rtp_session= create_duplex_rtp_session(vars);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);
/* СПеЎОМÑеЌ ÑОлÑÑÑÑ Ð¿ÐµÑеЎаÑÑОка. */
ms_filter_link(snd_card_read, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);
/* СПзЎаеЌ ÑОлÑÑÑÑ Ð¿ÑОеЌМПгП ÑÑакÑа. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);
/* СПзЎаеЌ ÑОлÑÑÑ ÐŽÐµÐºÐŸÐŽÐµÑа, */
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* СПзЎаеЌ ÑОлÑÑÑ Ð·Ð²ÑкПвПй каÑÑÑ. */
MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);
/* СПеЎОМÑеЌ ÑОлÑÑÑÑ Ð¿ÑОÑЌМПгП ÑÑакÑа. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, snd_card_write, 0);
/* СПзЎаеЌ ОÑÑПÑМОк ÑакÑПв - ÑОкеÑ. */
MSTicker *ticker = ms_ticker_new();
/* ÐПЎклÑÑаеЌ ОÑÑПÑМОк ÑакÑПв. */
ms_ticker_attach(ticker, snd_card_read);
ms_ticker_attach(ticker, rtprecv);
/* ÐÑлО МаÑÑÑПйка ÑаÑÑПÑÑ Ð³ÐµÐœÐµÑаÑПÑа ПÑлОÑМа ÐŸÑ ÐœÑлÑ, ÑП запÑÑкаеЌ геМеÑаÑПÑ. */
if (vars.dtmf_cfg.frequencies[0])
{
/* ÐаÑÑÑаОваеЌ ÑÑÑÑкÑÑÑÑ, ÑпÑавлÑÑÑÑÑ Ð²ÑÑ
ПЎМÑÐŒ ÑОгМалПЌ геМеÑаÑПÑа. */
vars.dtmf_cfg.duration = 10000;
vars.dtmf_cfg.amplitude = 1.0;
}
/* ÐÑгаМОзÑеЌ ÑОкл пеÑезапÑÑка геМеÑаÑПÑа. */
while(TRUE)
{
if(vars.dtmf_cfg.frequencies[0])
{
/* ÐклÑÑаеЌ звÑкПвПй геМеÑаÑПÑ. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&vars.dtmf_cfg);
}
/* УклаЎÑваеЌ ÑÑеЎ в ÑпÑÑÐºÑ ÐœÐ° 20ÐŒÑ, ÑÑÐŸÐ±Ñ ÐŽÑÑгОе ÑÑеЎÑ
* пÑÐžÐ»ÐŸÐ¶ÐµÐœÐžÑ Ð¿ÐŸÐ»ÑÑОлО вÑÐµÐŒÑ ÐœÐ° ÑабПÑÑ. */
ms_usleep(20000);
}
}
áá¯ááºááŒá áá¯á·á ááá¯á·áá±á¬áẠáááá¯ááááºááᯠááœááºáá»á°áá¬ááŸá áºáá¯á¶ážááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºááŒá áºáááºá áá«ááŸááá¯áẠá¡áá¯áá¯ááºááá·áº á¡ááá¯ááºážáá²á á¡á±á¬ááºáá±á¬áºááŒáá« á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááŒáá·áº TShark ááᯠáá»áœááºá¯ááºááá¯á· á áááºááá¯ááºááẠá
$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x
ááœááºááá¯ážááºááŸá áá áºááœáŸááºááá·áºá¡ááœááºááẠáááºážáá°ááŸá¯á áááºááŒááºážááŸáá·áºáááºáááºá áááºáá±á·áá»áºáá áºáá¯áá¬ááŒááá«áá áááºážááẠáá±á¬ááºážáá±á¬ááá¹ááá¬ááŒá áºááẠ- ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·áááááºáááºážááᯠá¡ááŒá¬ážáááá¯ááááºáá»á¬ážá áááááºážááá¯ááºááá¯ááºáᯠááá¯ááá¯áá«áááºá á¡ááŒá¬áž terminal ááœááºá ဠport áá¶áá«ááºááá¯áááºááŸááºááŒááºážááŒáá·áº "remote" intercom ááᯠá¡áá¯áá°ááá·áº program instance ááá¯ááœáá·áºáááº-
$ ./mstest8 --port 9010 --lport 7010
áááá¯ááááºá á¬áá¬ážááŸááœá±á·ááŒááºááá¯ááºáááºá¡ááá¯ááºážá áá°áááºáž IP ááááºá á¬ááẠ127.0.0.1 (local loopback) ááŒá áºáááºá
á¡ááŒá¬áž terminal ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±ááá¹ááá ááºááᯠá¡áá¯áá°ááá·áº áááá¯ááááºá áá¯áááá¥ááá¬áá áºáá¯ááᯠááœáá·áºáá±ážáá«áááºá Built-in á ááºážáááºááŸá¯ áá»ááºááá±áᬠá¡áá¯ááºáá¯ááºááá¯ááºá á±ááá·áº áá±á¬ááºááẠá¡ááŒááºážá¡áá¯á¶áá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á· á¡áá¯á¶ážááŒá¯áááº-
$ ./mstest8 --port 7010 --lport 9010 --gen 440
á€á¡ááá¯ááºá¡ááá·áºááœááºá "á¡áá±ážááááºáž" á ááºáá á¹á ááºážáá®ááá¯á· ááá¯á·ááœáŸááºáá±á¬ packets áá»á¬ážááẠTShark ááŒáá·áº ááœááºááá¯ážááºááœáẠflash áááºá áááºááá·áºááŒá®áž ááœááºáá»á°áá¬á áá®áá¬á០á¡áááºáááŒááºá¡áá¶ááá¯ááŒá¬ážááá«áááºá
á¡áááºá á¡áá¬á¡á¬ážáá¯á¶ážááẠáá±ážáá¬ážááá·áºá¡ááá¯ááºáž ááŒá áºááœá¬ážáá«áá áááá¯ááááºá áá¯ááááááá¹áá°ááᯠáá»áœááºá¯ááºááá¯á· ááŒááºáááºá áááºáá«á ááá¯á·áá±á¬áº áá±á¬á·ááŸáá·áº á¡ááŒá±á¬ááºážááŒáá»áẠââgen 440â ááá«áá² ááŒááºáááºá áááºáá«á ááᯠáááºááẠáá»ááºááá±áá¬á á¡áááºážááá¹áááœáẠáá«áááºáá¬áááºááŒá áºáááºá áááºážááŒá®ážáá±á¬ááºá áááºááẠááá¯ááºáááá¯áá¯ááºážááá¯á· áá°áá¶ááœá¬ážá á±ááá¯ááºáááºá á áá®áᬠááá¯á·ááá¯áẠáá¬ážááŒááºáá»á¬ážááœáẠáááºááá¯ááºáá±á¬ á¡áá¶ááᯠááŒá¬ážááá«áááºá á¡áá¶ááá¯ááºážááá¯ááºáᬠááá¯áá·áºááá¯ááºááá¯áẠá áááºááŸá¯ááºááŸá¬ážááŸá¯áá±á¬áẠááŒá áºáá±á«áºáá¬ááá¯ááºáááºá á áá®áá¬á á¡áá¶á¡ááá¯ážá¡áá»ááºááᯠááááºááá¯ááºááŒá®áž á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ áá»á±á¬ááºááœá¬ážáá«áááºá
á¡áááºá áááºááẠáááºážááᯠááœááºáá»á°áᬠááŸá áºáá¯á¶ážááœáẠáááºáááºááŒá®áž IP ááááºá á¬áá»á¬ážá¡ááŒá±á¬ááºáž áááŸá¯ááºááœá±ážáá«áá áá°áá®áá±á¬ ááááºááẠááá·áºá¡á¬áž á á±á¬áá·áºááŒáá¯áá±áá«ááẠ- two-way digital quality voice communication.
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠfilter áá»á¬ážáá±ážáá¬ážáááºážááᯠáá±á·áá¬áá«áááºá á€áá»áœááºážáá»ááºááŸá¯ááŒá±á¬áá·áº áááºááẠá¡áá¶ááŸáá·áº áá®áá®ááá¯á¡ááœááºáá¬áá á¡ááŒá¬ážáá±á¬ áá®ážááŒá¬ážáááºáááºáá»á¬ážááœááºáááºáž media streamer ááᯠáá¯á¶ážááá¯ááºáááºááŒá áºáááºá
source: www.habr.com