Π˜Π·ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ VoIP ΠΌΠΎΡ‚ΠΎΡ€Π° Mediastreamer2. Част 6

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŠΡ‚ Π½Π° статията Π΅ Π²Π·Π΅Ρ‚ ΠΎΡ‚ моя Π΄Π·Π΅Π½-ΠΊΠ°Π½Π°Π».

ΠŸΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊΠΎΠ² сигнал Ρ‡Ρ€Π΅Π· RTP ΠΏΠΎΡ‚ΠΎΠΊ

Π˜Π·ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ VoIP ΠΌΠΎΡ‚ΠΎΡ€Π° Mediastreamer2. Част 6

Π’ ΠΏΡ€Π΅Π΄Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° статията Π‘ΡŠΠ±Ρ€Π°Ρ…ΠΌΠ΅ схСма Π·Π° дистанционно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Π½Π° Ρ‚ΠΎΠ½Π°Π»Π½ΠΈ сигнали, ΠΊΠΎΠΈΡ‚ΠΎ работят Π² Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ сС Π½Π°ΡƒΡ‡ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° RTP (RFC 3550 β€” RTP: ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅) Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅/ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊΠΎΠ² сигнал ΠΏΡ€Π΅Π· Ethernet ΠΌΡ€Π΅ΠΆΠ°.

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŠΡ‚ RTP (ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅) Π½Π° Π±ΡŠΠ»Π³Π°Ρ€ΡΠΊΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Ρ‚ΠΎΠΉ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊ, Π²ΠΈΠ΄Π΅ΠΎ, Π΄Π°Π½Π½ΠΈ, всичко Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ изисква ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅. НапримСр, Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ Π·Π²ΡƒΠΊΠΎΠ² сигнал. Π“ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π΅ Ρ‚Π°ΠΊΠ°Π²Π°, Ρ‡Π΅ позволява ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡƒΠΊΠΎΠ² сигнал с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ качСство.

ΠŸΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° UDP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π΅ допусната Π·Π°Π³ΡƒΠ±Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. ВсСки ΠΏΠ°ΠΊΠ΅Ρ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° спСциалСн RTP Π·Π°Π³Π»Π°Π²Π΅Π½ Π±Π»ΠΎΠΊ ΠΈ Π±Π»ΠΎΠΊ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ Π½Π° прСдавания сигнал. Π’ Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ ΠΈΠΌΠ° случайно ΠΈΠ·Π±Ρ€Π°Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° сигнала, информация Π·Π° Ρ‚ΠΈΠΏΠ° Π½Π° прСдавания сигнал, ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ послСдоватСлСн Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π·Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ Ρ€Π΅Π΄, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ²Π° Π² какъв Ρ€Π΅Π΄ са Π±ΠΈΠ»ΠΈ доставСни ΠΎΡ‚ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°. Π—Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация, Ρ‚.Π½. Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Π·Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ към ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ‚Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π‘Π»ΠΎΠΊΡŠΡ‚ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° полСзния Ρ‚ΠΎΠ²Π°Ρ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π°Ρ‚Π° организация Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ зависи ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π½Π° Ρ‚ΠΎΠ²Π°Ρ€Π°, Ρ‚ΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΠ±ΠΈ ΠΎΡ‚ ΠΌΠΎΠ½ΠΎΡ„ΠΎΠ½ΠΈΡ‡Π΅Π½ сигнал, стСрСосигнал, Ρ€Π΅Π΄ ΠΎΡ‚ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ‚.Π½.

Π’ΠΈΠΏΡŠΡ‚ Π½Π° Ρ‚ΠΎΠ²Π°Ρ€Π° Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ с сСдСм Π±ΠΈΡ‚ΠΎΠ²ΠΎ число. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ°Ρ‚Π° RFC3551 (RTP ΠŸΡ€ΠΎΡ„ΠΈΠ» Π·Π° Π°ΡƒΠ΄ΠΈΠΎ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ») установява няколко Ρ‚ΠΈΠΏΠ° Ρ‚ΠΎΠ²Π°Ρ€ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, която Π΄Π°Π²Π° описаниС Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ Ρ‚ΠΎΠ²Π°Ρ€ ΠΈ стойността Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅Ρ‚Π΅, с ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚Π΅ сС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°Ρ‚. Част ΠΎΡ‚ ΠΊΠΎΠ΄ΠΎΠ²Π΅Ρ‚Π΅ нямат строга приврзаност към ΠΊΠ°ΠΊΡŠΠ²Ρ‚ΠΎ ΠΈ Π΄Π° Π΅ Ρ‚ΠΈΠΏ Ρ‚ΠΎΠ²Π°Ρ€ - Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Ρ‚ΠΎΠ²Π°Ρ€.

Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½ΠΈ Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΎΡ‚ максималния Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ Π² ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π±Π΅Π· сСгмСнтиранС (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ MTU). ОбикновСно Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 1500 Π±Π°ΠΉΡ‚Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π·Π° Π΄Π° сС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ количСството Π΄Π°Π½Π½ΠΈ, ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈ Π² сСкунда, Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π° слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ чСстотата Π½Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅. Π—Π° мСдиастриймСра Ρ‚ΠΎΠ²Π° Π΅ настройваСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Ρ‚ΠΎΠΉ Π΅ 50 Hz, Ρ‚.Π΅. 50 ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² сСкунда. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈΡ‚Π΅ RTP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Ρ‰Π΅ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ RTP ΠΏΠΎΡ‚ΠΎΠΊ.

Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ прСдаватСлят Π΄Π° Π·Π½Π°Π΅ IP адрСса Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‚ΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅. Π’.Π΅. Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΡŠΡ‚ Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° ΠΏΡ€Π΅Π΄Π°Π²Π° Π΄Π°Π½Π½ΠΈ, Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΡŠΡ‚ Π΅ Π³ΠΎΡ‚ΠΎΠ² Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π‘ΠΏΠΎΡ€Π΅Π΄ стандарта Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° RTP ΠΏΠΎΡ‚ΠΎΠΊΠ°, трябва Π΄Π° Π΅ Ρ‡Π΅Ρ‚Π΅Π½.

Π’ ситуации, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° сС Π·Π½Π°Π΅ Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΡ†ΠΈΡ‚Π΅ оставят адрСса си, Π° прСдаватСлят ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΈΡ‚Π°, ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΉΠΊΠΈ сС Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°.

Π’ случаитС, ΠΊΠΎΠ³Π°Ρ‚ΠΎ качСството Π½Π° ΠΊΠ°Π½Π°Π»Π° Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° Π½Π΅ са извСстни, сС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π° ΠΊΠ°Π½Π°Π» Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° прСдаватСля Π·Π° своитС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, количСството ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΈ Ρ‚.Π½. Π’ Ρ‚Π°ΠΊΡŠΠ² ΠΊΠ°Π½Π°Π» сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° RTCP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π€ΠΎΡ€ΠΌΠ°Ρ‚ΡŠΡ‚ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ ΠΊΠ°Π½Π°Π», Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² RFC 3605. По Ρ‚ΠΎΠ·ΠΈ ΠΊΠ°Π½Π°Π» сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ сравнитСлно ΠΌΠ°Π»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ - 200..300 Π±Π°ΠΉΡ‚Π° Π² сСкунда, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ Π½Π΅ Π΅ ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»Π½ΠΎ. ΠΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ RTCP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅, трябва Π΄Π° Π΅ Π½Π΅Ρ‡Π΅Ρ‚Π΅Π½ ΠΈ с Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΎΡ‚ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠ΄Π²Π° RTP ΠΏΠΎΡ‚ΠΎΠΊΡŠΡ‚. Π’ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ няма Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ ΠΊΠ°Π½Π°Π», Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈ ΠΊΠ°Π½Π°Π»Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»ΡΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅, всС ΠΎΡ‰Π΅ скромни, Π½ΡƒΠΆΠ΄ΠΈ.

Π’ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° схСмата Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, Π·Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ схСмата Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‰Π΅ бъдС Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Π΄Π²Π΅ части: ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π»Π΅Π½ Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅Π½ Ρ‚Ρ€Π°ΠΊΡ‚. Π—Π° всяка част Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ свой ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΈ сигнали, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Π·Π°Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°.

Едностранната Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ тях Ρ‰Π΅ сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Ρ‡Ρ€Π΅Π· RTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Π½ΠΈ Π΅ Π½ΡƒΠΆΠ½Π° външна ΠΌΡ€Π΅ΠΆΠ°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ прСдаватСлят, Ρ‚Π°ΠΊΠ° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΡŠΡ‚ Ρ‰Π΅ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€ β€” ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ Ρ‰Π΅ сС Π΄Π²ΠΈΠΆΠ°Ρ‚ Π²ΡŠΡ‚Ρ€Π΅ Π² Π½Π΅Π³ΠΎ.

Π—Π° установяванС Π½Π° RTP ΠΏΠΎΡ‚ΠΎΠΊ Π² мСдиастримСра сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄Π²Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°: MS_RTP_SEND ΠΈ MS_RTP_RECV. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅, вторият ΠΏΡ€ΠΈΠ΅ΠΌΠ° RTP ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π° Ρ‚Π΅Π·ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, трябва Π΄Π° ΠΈΠΌ сС ΠΏΡ€Π΅Π΄Π°Π΄Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към ΠΎΠ±Π΅ΠΊΡ‚ RTP сСсия, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ RTP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ПонСТС Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° мСдиастримСра Π½Π΅ съвпада с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° RTP ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ Π΄Π°Π½Π½ΠΈ Π½Π° MS_RTP_SEND, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ (encoder), ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° 16-Π±ΠΈΡ‚ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ±ΠΈ Π½Π° звуковия сигнал Π² осСмбитови, ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ u-Π·Π°ΠΊΠΎΠ½Π° (мю-Π·Π°ΠΊΠΎΠ½Π°). На ΠΏΡ€ΠΈΠ΅ΠΌΠ½Π°Ρ‚Π° страна ΠΎΠ±Ρ€Π°Ρ‚Π½Π°Ρ‚Π° функция сС изпълнява ΠΎΡ‚ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°.

По-Π΄ΠΎΠ»Ρƒ Π΅ Ρ‚Π΅ΠΊΡΡ‚ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‰Π° схСмата ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ (символитС # ΠΏΡ€Π΅Π΄ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΈΡ‚Π΅ include са ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΈ, Π½Π΅ забравяйтС Π΄Π° Π³ΠΈ поставитС):

/* Π€Π°ΠΉΠ» mstest6.c Π˜ΠΌΠΈΡ‚Π°Ρ‚ΠΎΡ€ ΠΏΡƒΠ»ΡŒΡ‚Π° управлСния ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */

#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/msvolume.h>
#include <mediastreamer2/mstonedetector.h>
#include <mediastreamer2/msrtp.h>
#include <ortp/rtpsession.h>
#include <ortp/payloadtype.h>

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с функциями управлСния событиями
* мСдиастримСра.*/
include <mediastreamer2/mseventqueue.h>

#define PCMU 0

/* Ѐункция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½
ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ совпадСниС характСристик Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,
MSToneDetectorEvent *ev)
{
printf("ΠŸΡ€ΠΈΠ½ΡΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %sn", ev->tone_name);
}

/*----------------------------------------------------------------------------*/
/* Ѐункция рСгистрации Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ. */
void register_payloads(void)
{
/*РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ. ПозднСС, ΠΏΠΎ индСксу
взятому ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° RTP-ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ· этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ
ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для дСкодирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°. */
rtp_profile_set_payload (&av_profile, PCMU, &payload_type_pcm8000);
}

/*----------------------------------------------------------------------------*/
/* Π­Ρ‚Π° функция создана ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ create_duplex_rtpsession() Π² audiostream.c
мСдиастримСра2. */
static RtpSession *
create_rtpsession (int loc_rtp_port, int loc_rtcp_port,
bool_t ipv6, RtpSessionMode mode)
{
RtpSession *rtpr;
rtpr = rtp_session_new ((int) mode);
rtp_session_set_scheduling_mode (rtpr, 0);
rtp_session_set_blocking_mode (rtpr, 0);
rtp_session_enable_adaptive_jitter_compensation (rtpr, TRUE);
rtp_session_set_symmetric_rtp (rtpr, TRUE);
rtp_session_set_local_addr (rtpr, ipv6 ? "::" : "0.0.0.0", loc_rtp_port,
loc_rtcp_port);
rtp_session_signal_connect (rtpr, "timestamp_jump",
(RtpCallback) rtp_session_resync, 0);
rtp_session_signal_connect (rtpr, "ssrc_changed",
(RtpCallback) rtp_session_resync, 0);
rtp_session_set_ssrc_changed_threshold (rtpr, 0);
rtp_session_set_send_payload_type(rtpr, PCMU);

/* По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ RTCP-сСссию, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш ΠΏΡƒΠ»ΡŒΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘. */
rtp_session_enable_rtcp (rtpr, FALSE);
return rtpr;
}

/*----------------------------------------------------------------------------*/
int main()
{
ms_init();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ экзСмпляры Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ². */
MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
MSFilter *volume = ms_filter_new(MS_VOLUME_ID);
MSSndCard *card_playback =
ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
MSFilter *snd_card_write = ms_snd_card_create_writer(card_playback);
MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);

/* ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ массив находящийся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Ρ‚ΠΎΠ½ΠΎΠ², ΠΎΠ½ описываСт
* особыС ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹ разыскиваСмых сигналов.*/
ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. */
ms_filter_set_notify_callback(detector,
(MSFilterNotifyFunc)tone_detected_cb, NULL);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ массив, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ описываСт характСристику
* ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΎΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ: ВСкстовоС имя
* Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта, частота Π² Π³Π΅Ρ€Ρ†Π°Ρ…, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² миллисСкундах,
* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 0,775Π’. */
MSToneDetectorDef scan[6]=
{
{"V+",440, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
{"V-",540, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ". */
{"C+",640, 100, 0.1}, /* Команда "Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
{"C-",740, 100, 0.1}, /* Команда "Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°". */
{"ON",840, 100, 0.1}, /* Команда "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
{"OFF", 940, 100, 0.1}/* Команда "Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€". */
};

/* ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ "ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Ρ‹" сигналов Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚ΠΎΠ½ΠΎΠ². */
int i;
for (i = 0; i < 6; i++)
{
ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,
&scan[i]);
}

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΊΠΎΠ΄Π΅Ρ€Π° ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° */
MSFilter *encoder = ms_filter_create_encoder("PCMU");
MSFilter *decoder=ms_filter_create_decoder("PCMU");
/* РСгистрируСм Ρ‚ΠΈΠΏΡ‹ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. */
register_payloads();

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */
RtpSession *tx_rtp_session = create_rtpsession (8010, 8011, FALSE, RTP_SESSION_SENDONLY);
rtp_session_set_remote_addr_and_port(tx_rtp_session,"127.0.0.1", 7010, 7011);
rtp_session_set_send_payload_type(tx_rtp_session, PCMU);
MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);
ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, tx_rtp_session);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ RTP-сСссию ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. */
MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
RtpSession *rx_rtp_session = create_rtpsession (7010, 7011, FALSE, RTP_SESSION_RECVONLY);
ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rx_rtp_session);

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ источники Ρ‚Π°ΠΊΡ‚ΠΎΠ² - Ρ‚ΠΈΠΊΠ΅Ρ€Ρ‹. */
MSTicker *ticker_tx = ms_ticker_new();
MSTicker *ticker_rx = ms_ticker_new();

/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°. */
ms_filter_link(voidsource, 0, dtmfgen, 0);
ms_filter_link(dtmfgen, 0, volume, 0);
ms_filter_link(volume, 0, encoder, 0);
ms_filter_link(encoder, 0, rtpsend, 0);

/* БоСдиняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ°. */
ms_filter_link(rtprecv, 0, decoder, 0);
ms_filter_link(decoder, 0, detector, 0);
ms_filter_link(detector, 0, snd_card_write, 0);

/* ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ источник Ρ‚Π°ΠΊΡ‚ΠΎΠ². */
ms_ticker_attach(ticker_tx, voidsource);
ms_ticker_attach(ticker_rx, rtprecv);

/* НастраиваСм структуру, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ сигналом Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. */
MSDtmfGenCustomTone dtmf_cfg;
dtmf_cfg.tone_name[0] = 0;
dtmf_cfg.duration = 1000;
dtmf_cfg.frequencies[0] = 440;
/* Π‘ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠ½, частоту Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΎΠ½Π° установим Π² 0. */
dtmf_cfg.frequencies[1] = 0;
dtmf_cfg.amplitude = 1.0;
dtmf_cfg.interval = 0.;
dtmf_cfg.repeat_count = 0.;

/* ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» сканирования Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… клавиш. Π’Π²ΠΎΠ΄ нуля Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚
* Ρ†ΠΈΠΊΠ» ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. */
char key='9';
printf("НаТмитС ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°Ρ‚Π΅ΠΌ Π²Π²ΠΎΠ΄.n"
"Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ 0.n");
while(key != '0')
{
key = getchar();
if ((key >= 49) && (key <= 54))
{
printf("ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: %cn", key);

/* УстанавливаСм частоту Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² соотвСтствии с
 * ΠΊΠΎΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши. */
dtmf_cfg.frequencies[0] = 440 + 100*(key-49);

/* Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ c ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ частотой. */
ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
(void*)&dtmf_cfg);
}

/* Π£ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π΄ Π² спячку Π½Π° 20мс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π΄Ρ‹
 * прилоТСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ врСмя Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ. */
ms_usleep(20000);
}
}

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°ΠΌΠ΅ ΠΈ стартирамС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Ρ‰Π΅ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΏΡ€Π΅Π· RTP ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’ слСдващата статия Ρ‰Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° Π΄Π²Π΅ нСзависими прилоТСния β€” ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΈ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π» ΠΈ Ρ‰Π΅ Π³ΠΈ стартирамС Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΈ. ΠŸΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ Ρ‰Π΅ Π½Π°ΡƒΡ‡ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ RTP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° TShark.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster