Mediastreamer2 āĻ­āĻŋāĻ“āĻ†āĻ‡āĻĒāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 9

āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ†āĻŽāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻœā§‡āĻ¨ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛.

āĻĄā§āĻĒā§āĻ˛ā§‡āĻ•ā§āĻ¸ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ•āĻŽ

Mediastreamer2 āĻ­āĻŋāĻ“āĻ†āĻ‡āĻĒāĻŋ āĻ‡āĻžā§āĻœāĻŋāĻ¨ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 9

āĻļā§‡āĻˇā§‡ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ āĻāĻ•āĻŸāĻŋ āĻĄā§āĻĒā§āĻ˛ā§‡āĻ•ā§āĻ¸ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ•āĻŽ āĻ˜ā§‹āĻˇāĻŖāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦāĨ¤

āĻšāĻŋāĻ¤ā§āĻ°āĻŸāĻŋ āĻļāĻŋāĻ°ā§‹āĻ¨āĻžāĻŽ āĻšāĻŋāĻ¤ā§āĻ°ā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ¨ā§€āĻšā§‡āĻ° āĻšā§‡āĻ‡āĻ¨āĻŸāĻŋ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĒāĻžāĻĨ āĻ—āĻ āĻ¨ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻ¸āĻžāĻ‰āĻ¨ā§āĻĄ āĻ•āĻžāĻ°ā§āĻĄ āĻĨā§‡āĻ•ā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻĢā§‹āĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻ¨āĻŽā§āĻ¨āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡, āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡ 8000 āĻ¨āĻŽā§āĻ¨āĻžāĻ° āĻšāĻžāĻ°ā§‡ āĻ˜āĻŸā§‡āĨ¤ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻžāĻ° āĻ…āĻĄāĻŋāĻ“ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻ¯ā§‡ āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻŸ āĻ—āĻ­ā§€āĻ°āĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¤āĻž āĻšāĻ˛ 16 āĻŦāĻŋāĻŸ (āĻāĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻ¯āĻŧ; āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻšāĻžāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŽāĻ¨ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯āĻž āĻ‰āĻšā§āĻšāĻ¤āĻ° āĻŦāĻŋāĻŸ āĻ—āĻ­ā§€āĻ°āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡)āĨ¤ āĻĄā§‡āĻŸāĻž 160 āĻŸāĻŋ āĻ¨āĻŽā§āĻ¨āĻžāĻ° āĻŦā§āĻ˛āĻ•ā§‡ āĻŦāĻŋāĻ­āĻ•ā§āĻ¤āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ†āĻ•āĻžāĻ° 320 āĻŦāĻžāĻ‡āĻŸāĨ¤ āĻāĻ°āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻ‡āĻ¨āĻĒā§āĻŸā§‡ āĻĄā§‡āĻŸāĻž āĻĢāĻŋāĻĄ āĻ•āĻ°āĻŋ, āĻ¯āĻž āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ˛ā§‡ āĻĄā§‡āĻŸāĻžāĻ¤ā§‡ "āĻ¸ā§āĻŦāĻšā§āĻ›" āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻĢā§‹āĻ¨ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻ¤ā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻ•ā§āĻ˛āĻžāĻ¨ā§āĻ¤ āĻšāĻ¯āĻŧā§‡ āĻĒāĻĄāĻŧā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĻ›āĻŋ - āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻŸā§‹āĻ¨ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻ¸āĻš āĻĒāĻĨ "āĻļā§āĻŸ" āĻ•āĻ°āĻ¤ā§‡ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻĒāĻ°ā§‡, āĻ¸āĻ‚āĻ•ā§‡āĻ¤āĻŸāĻŋ āĻāĻ¨āĻ•ā§‹āĻĄāĻžāĻ°ā§‡ āĻ¯āĻžāĻ¯āĻŧ, āĻ¯āĻž Âĩ-āĻ˛ (G.16 āĻŽāĻžāĻ¨) āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° 711-āĻŦāĻŋāĻŸ āĻ¨āĻŽā§āĻ¨āĻžāĻ•ā§‡ āĻ†āĻŸ-āĻŦāĻŋāĻŸ āĻ¨āĻŽā§āĻ¨āĻžāĻ¯āĻŧ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§‡āĨ¤ āĻāĻ¨āĻ•ā§‹āĻĄāĻžāĻ°ā§‡āĻ° āĻ†āĻ‰āĻŸāĻĒā§āĻŸā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ…āĻ°ā§āĻ§ā§‡āĻ• āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻĄā§‡āĻŸāĻž āĻŦā§āĻ˛āĻ• āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻŸā§āĻ°āĻžāĻĢāĻŋāĻ• āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨āĻž āĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ–āĻžāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ¨āĻ•ā§‹āĻĄāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ Wireshark āĻāĻ•āĻŸāĻŋ RTP āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻĨā§‡āĻ•ā§‡ āĻ…āĻĄāĻŋāĻ“ āĻĒā§āĻ¨āĻ°ā§āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻ–āĻ¨ āĻāĻŸāĻŋ Âĩ-law āĻŦāĻž a-law āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤

āĻāĻ¨āĻ•ā§‹āĻĄāĻžāĻ°ā§‡āĻ° āĻĒāĻ°ā§‡, āĻĄā§‡āĻŸāĻžāĻ° āĻšāĻžāĻ˛āĻ•āĻž āĻŦā§āĻ˛āĻ•āĻ—ā§āĻ˛āĻŋ rtpsend āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ RTP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡ āĻ°āĻžāĻ–āĻŦā§‡, āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ UDP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ†āĻ•āĻžāĻ°ā§‡ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻ¸āĻ‚āĻ•ā§āĻ°āĻŽāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻžāĻ°āĻ•ā§‡ āĻĻā§‡āĻŦā§‡ā§ˇ

āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ‰āĻĒāĻ°ā§‡āĻ° āĻšā§‡āĻ‡āĻ¨āĻŸāĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĒāĻĨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡; āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ RTP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ rtprecv āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°ā§‡, āĻ¯āĻžāĻ° āĻ†āĻ‰āĻŸāĻĒā§āĻŸā§‡ āĻ¤āĻžāĻ°āĻž āĻĄā§‡āĻŸāĻž āĻŦā§āĻ˛āĻ• āĻ†āĻ•āĻžāĻ°ā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻŋāĻ˛ā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻŦā§āĻ˛āĻ•āĻŸāĻŋāĻ¤ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§‡āĻ˛ā§‹āĻĄ āĻĄā§‡āĻŸāĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡; āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻšāĻŋāĻ¤ā§āĻ°ā§‡ āĻ¸āĻŦā§āĻœ āĻ°āĻ™ā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻāĻ° āĻĒāĻ°ā§‡, āĻŦā§āĻ˛āĻ•āĻ—ā§āĻ˛āĻŋ āĻĄāĻŋāĻ•ā§‹āĻĄāĻžāĻ° āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĨāĻžāĻ•āĻž āĻāĻ•āĻ•-āĻŦāĻžāĻ‡āĻŸ āĻ¨āĻŽā§āĻ¨āĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ°ā§ˆāĻ–āĻŋāĻ•, 16-āĻŦāĻŋāĻŸāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻžāĻ° āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ•ā§‡āĻŦāĻ˛ āĻ†āĻĒāĻ¨āĻžāĻ° āĻšā§‡āĻĄāĻ¸ā§‡āĻŸā§‡āĻ° āĻ¸ā§āĻĒāĻŋāĻ•āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ˛ā§‡āĻŦā§āĻ¯āĻžāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻ‰āĻ¨ā§āĻĄ āĻ•āĻžāĻ°ā§āĻĄā§‡ āĻĒāĻžāĻ āĻžāĻ‡āĨ¤

āĻāĻ–āĻ¨ āĻ¸āĻĢā§āĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻāĻ—āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ•āĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻ°āĻŋāĻ¸āĻŋāĻ­āĻžāĻ° āĻāĻŦāĻ‚ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸāĻžāĻ° āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻŦ āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻ†āĻ—ā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻāĻ° āĻ†āĻ—ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§‹āĻ°ā§āĻŸ āĻāĻŦāĻ‚ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤āĻžāĻŽ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸ā§‡āĻ‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸāĻ†āĻĒā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻŋāĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦāĨ¤ āĻāĻ° āĻĒāĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¯ā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ•āĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻžāĻ° 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 āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻ° āĻĒāĻ°ā§‡, āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

/* ФŅƒĐŊĐēŅ†Đ¸Ņ ĐŋŅ€ĐĩОйŅ€Đ°ĐˇĐžĐ˛Đ°ĐŊиŅ Đ°Ņ€ĐŗŅƒĐŧĐĩĐŊŅ‚Ов ĐēĐžĐŧĐ°ĐŊĐ´ĐŊОК ŅŅ‚Ņ€ĐžĐēи в
* ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹. */
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]);
        }
    }
}

āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻĢāĻ˛ā§‡, āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ vars āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻžāĻœ āĻšāĻŦā§‡ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻŋāĻ‚ āĻĒāĻžāĻĨ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻž; āĻŸāĻŋāĻ•āĻžāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¸ā§€āĻŽ āĻ˛ā§āĻĒā§‡ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°āĻŋāĻ¤ āĻšāĻŦā§‡ āĻ¯āĻž, āĻ¯āĻĻāĻŋ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻ…-āĻļā§‚āĻ¨ā§āĻ¯ā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ° āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŦā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻāĻŸāĻž āĻŦāĻ¨ā§āĻ§ āĻ›āĻžāĻĄāĻŧāĻž āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻāĻ‡ āĻ°āĻŋāĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡; āĻ•āĻŋāĻ›ā§ āĻ•āĻžāĻ°āĻŖā§‡ āĻāĻŸāĻŋ 16 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡āĻ° āĻŦā§‡āĻļāĻŋ āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻāĻ•āĻŸāĻŋ 32-āĻŦāĻŋāĻŸ āĻ¨āĻŽā§āĻŦāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻāĻ‡ āĻŽāĻ¤ āĻĻā§‡āĻ–āĻžāĻŦā§‡:

/* ФаКĐģ 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

āĻ¯āĻĻāĻŋ āĻ•āĻ¨āĻ¸ā§‹āĻ˛ā§‡ āĻ˛āĻžā§āĻš āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•ā§āĻ¯āĻžāĻĒāĻšāĻžāĻ°ā§‡āĻ° āĻļā§āĻ°ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻšāĻŋāĻšā§āĻ¨ - āĻāĻ° āĻŽāĻžāĻ¨ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§‹āĻ°ā§āĻŸ āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĻāĻ–āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ…āĻ¨ā§āĻ¯ āĻŸāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ‡āĻ¨āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻ¸ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŋ āĻ¯āĻž āĻāĻ‡ āĻĒā§‹āĻ°ā§āĻŸ āĻ¨āĻŽā§āĻŦāĻ°āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ "āĻ°āĻŋāĻŽā§‹āĻŸ" āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ•āĻŽ āĻ…āĻ¨ā§āĻ•āĻ°āĻŖ āĻ•āĻ°āĻŦā§‡:

$ ./mstest8 --port 9010 --lport 7010

āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĒāĻžāĻ ā§āĻ¯ āĻĨā§‡āĻ•ā§‡ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ¯āĻŧ, āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ†āĻ‡āĻĒāĻŋ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻšāĻ˛ 127.0.0.1 (āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ˛ā§āĻĒāĻŦā§āĻ¯āĻžāĻ•)āĨ¤

āĻ…āĻ¨ā§āĻ¯ āĻŸāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŋ, āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻ•ā§‡ āĻ…āĻ¨ā§āĻ•āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ¯āĻž āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°āĻ•ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ:

$ ./mstest8  --port 7010 --lport 9010 --gen 440

āĻāĻ‡ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§‡, "āĻ°āĻŋāĻŽā§‹āĻŸ" āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻŸāĻŋāĻļāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻ¨āĻ¸ā§‹āĻ˛ā§‡ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻļ āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ° āĻ¸ā§āĻĒāĻŋāĻ•āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻ° āĻļā§‹āĻ¨āĻž āĻ¯āĻžāĻŦā§‡āĨ¤

āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻ˜āĻŸā§‡ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋāĻ° āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŋ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ•ā§€ āĻāĻŦāĻ‚ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ "—āĻœā§‡āĻ¨ 440" āĻ›āĻžāĻĄāĻŧāĻžāĻ‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻ¨ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāĻžāĻ˛āĻ¨ āĻ•āĻ°āĻŦā§‡āĻ¨āĨ¤ āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻĢā§‹āĻ¨ā§‡ āĻļāĻŦā§āĻĻ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨; āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻĒāĻŋāĻ•āĻžāĻ° āĻŦāĻž āĻšā§‡āĻĄāĻĢā§‹āĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻļāĻŦā§āĻĻ āĻļā§āĻ¨āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§‹āĻ¸ā§āĻŸāĻŋāĻ• āĻ¸ā§āĻŦ-āĻ‰āĻ¤ā§āĻ¤ā§‡āĻœāĻ¨āĻž āĻ˜āĻŸāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡; āĻ¸ā§āĻĒāĻŋāĻ•āĻžāĻ°ā§‡āĻ° āĻ­āĻ˛āĻŋāĻ‰āĻŽ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ­āĻžāĻŦāĻŸāĻŋ āĻ…āĻĻā§ƒāĻļā§āĻ¯ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻĻā§āĻŸāĻŋ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ āĻāĻŦāĻ‚ IP āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻŦāĻŋāĻ­ā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻ¨āĻž āĻšāĻ¨ āĻ¤āĻŦā§‡ āĻāĻ•āĻ‡ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ†āĻĒāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ›ā§‡ - āĻĻā§āĻŦāĻŋāĻŽā§āĻ–ā§€ āĻĄāĻŋāĻœāĻŋāĻŸāĻžāĻ˛ āĻŽāĻžāĻ¨ā§‡āĻ° āĻ­āĻ¯āĻŧā§‡āĻ¸ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—āĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻ°āĻž āĻļāĻŋāĻ–āĻŦ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° - āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ, āĻāĻ‡ āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ āĻ†āĻĒāĻ¨āĻŋ āĻŽāĻŋāĻĄāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻžāĻ°āĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ…āĻĄāĻŋāĻ“ āĻāĻŦāĻ‚ āĻ­āĻŋāĻĄāĻŋāĻ“āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻ¨āĻ¯āĻŧ, āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ“ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĻ¨āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨