Π˜ΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° VoIP ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Mediastreamer2. Π”Π΅Π» 6

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π»ΠΎΡ‚ Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅Ρ‚ΠΎ Π·Π΅Π½ ΠΊΠ°Π½Π°Π».

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

Π˜ΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° VoIP ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚ Mediastreamer2. Π”Π΅Π» 6

Π’ΠΎ послСдниот Π§Π»Π΅Π½ Π‘ΠΎΠ±Ρ€Π°Π²ΠΌΠ΅ ΠΊΠΎΠ»ΠΎ Π·Π° далСчинско ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° Ρ‚ΠΎΠ½ΠΎΠ²ΠΈ ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° Ρ‚ΠΎΠ½ΠΎΠ²ΠΈ ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° истата ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС Π½Π°ΡƒΡ‡ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ користимС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΡ‚ RTP (RFC 3550 - RTP: ВранспортСн ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅) Π·Π° ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅/прСнос Π½Π° Π°ΡƒΠ΄ΠΈΠΎ сигнал ΠΏΡ€Π΅ΠΊΡƒ Π΅Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΌΡ€Π΅ΠΆΠ°.

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, Ρ‚Ρ€Π΅Π±Π° Π΄Π° користитС Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ Π·Π° Π΅Π½ΠΊΠΎΠ΄Π΅Ρ€ кој ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ ΠΎΠ΄ 16-Π±ΠΈΡ‚Π½ΠΈ Π°ΡƒΠ΄ΠΈΠΎ сигнал Π²ΠΎ осум-Π±ΠΈΡ‚Π½ΠΈ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΈ спорСд Ρƒ-Π·Π°ΠΊΠΎΠ½ (ΠΌΡƒ-Π»Π°Π²). На ΠΏΡ€ΠΈΠ΅ΠΌΠ½Π°Ρ‚Π° страна, Ρ„ΠΈΠ»Ρ‚Π΅Ρ€ΠΎΡ‚ Π·Π° Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° спротивната Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°.

ΠŸΠΎΠ΄ΠΎΠ»Ρƒ Π΅ тСкстот Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΡˆΡ‚ΠΎ ја ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΡˆΠ΅ΠΌΠ°Ρ‚Π° ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ°Π½Π° Π½Π° сликата (# симболитС ΠΏΡ€Π΅Π΄ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΈΡ‚Π΅ Π·Π° Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ сС отстранСти, Π½Π΅ Π·Π°Π±ΠΎΡ€Π°Π²Π°Ρ˜Ρ‚Π΅ Π΄Π° Π³ΠΈ Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅):

/* Π€Π°ΠΉΠ» 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.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€