ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π΅ Π²Π·Π΅Ρ ΠΎΡ ΠΌΠΎΡ .
ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡΠΊΠΎΠ² ΡΠΈΠ³Π½Π°Π» ΡΡΠ΅Π· RTP ΠΏΠΎΡΠΎΠΊ

Π ΠΏΡΠ΅Π΄Ρ ΠΎΠ΄Π½Π°ΡΠ° Π‘ΡΠ±ΡΠ°Ρ ΠΌΠ΅ ΡΡ Π΅ΠΌΠ° Π·Π° Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π½Π° ΡΠΎΠ½Π°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Π² Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° 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
