ΠΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½ ΠΎΠ΄ ΠΌΠΎΠ΅ΡΠΎ
ΠΠΎΠ²Π΅Π΄
ΠΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° Π΅ ΠΏΠΎΡΠ΅ΡΠΎΠΊ Π½Π° ΡΠ΅ΡΠΈΡΠ°ΡΠ° Π½Π°ΠΏΠΈΡΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΠΈ Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΌΠΎΡΠΎΡΠΎΡ Mediastreamer2. ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ Π²Π΅ΡΡΠΈΠ½ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π²ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΠΠΈΠ½ΡΠΊΡ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ°Π·ΠΈΠΊΠΎΡ Π¦.
Mediastreamer2 Π΅ VoIP ΠΌΠΎΡΠΎΡΠΎΡ Π·Π°Π΄ ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈΠΎΡ ΡΠΎΡΡΠ²Π΅Ρ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Voip ΡΠ΅Π»Π΅ΡΠΎΠ½ΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠΎΠ½Π°ΡΠ°ΠΌΡ Π²ΠΎ ΡΠ΅ΠΊΡΡΠΎΡ, Π·Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ, Π½Π°ΠΌΠ΅ΡΡΠΎ Π·Π±ΠΎΡΠΎΡ Mediastreamer2 ΡΠ΅ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΡΠΊΠ° Π½ΠΎΡΠ°ΡΠΈΡΠ°: βmedia streamerβ.
ΠΡΡΠΎΡΠΈΡΠ°ΡΠ° Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π΅ Π΅ ΡΠΎΡΠ΅ΠΌΠ° ΡΠ°ΡΠ½Π°, Π½ΠΎ ΡΡΠ΄Π΅ΡΡΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄, ΡΠ°Π° ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅Π»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°
ΠΠΎ ΡΡΡΠ΅ΡΠΎ Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ Π΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π°ΡΠ΅ΡΠ΅Π½Π° βΠΡΠΎΡΠΎΠΊ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈβ (ΠΏΡΠΎΡΠΎΠΊ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ). ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ.
ΠΠΎ ΠΎΠ²Π°Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π΅ Π΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΠΊΠΎΠ΄, ΡΡΠΊΡ ΡΠΎ ΡΠ΅ΠΌΠ° (Π³ΡΠ°ΡΠΈΠΊ) Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π°Ρ ΠΏΠΎ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄. ΠΠ²ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π°Π°Ρ ΡΠΈΠ»ΡΡΠΈ.
ΠΠ²Π°Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΠΈ Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° Π·Π±ΠΈΡ Π½Π° ΡΠΈΠ»ΡΡΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ Π²ΠΎ ΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΠΏΡΠ΅Π½ΠΎΡ Π½Π° RTP ΡΠΎΠΎΠ±ΡΠ°ΡΠ°Ρ Π½Π° ΡΠ΅Π»Π΅ΡΠΎΠ½ VoIP.
Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π°Ρ ΡΠΈΠ»ΡΡΠΈ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΡΠ΅ΠΌΠΈ, Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΠΎΡ ΡΠ°Π·Π²ΠΎΡ Π½Π° Π½ΠΎΠ²ΠΈ ΡΠΈΠ»ΡΡΠΈ, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠ½Π° ΠΏΠΎΡΠ΅Π±Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°Π°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π²ΠΎ ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° VoIP, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π°Ρ ΡΠΈΠ»ΡΡΠΈ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΠΎΠ΄ ΡΠ°ΠΌΠΈΠΎΡ ΡΠ΅Π±Π΅.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ ΡΠΈΠ»ΡΡΠΈ ΡΡΠΎ Π΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° Π΅ Π΄ΠΎΡΡΠ° Π±ΠΎΠ³Π°ΡΠ° ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠΈ ΡΠΎ ΡΠΈΠ»ΡΡΠΈ ΠΎΠ΄ Π½Π°Ρ ΡΠΎΠΏΡΡΠ²Π΅Π½ Π΄ΠΈΠ·Π°ΡΠ½. ΠΠΎ, ΠΏΡΠ²ΠΎ, Π΄Π° Π³ΠΈ ΠΎΠΏΠΈΡΠ΅ΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ ΡΡΠΎ Π΄ΠΎΠ°ΡΠ°Π°Ρ ΡΠΎ ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ. ΠΠ²Π΅ ΡΠ° Π½ΠΈΠ²Π½Π°ΡΠ° Π»ΠΈΡΡΠ°:
Π€ΠΈΠ»ΡΡΠΈ Π·Π° Π·Π²ΡΠΊ
ΠΡΠ΄ΠΈΠΎ ΡΠ½ΠΈΠΌΠ°ΡΠ΅ ΠΈ ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ°
- ΠΠ»ΡΠ° (ΠΠΈΠ½ΡΠΊΡ): MS_ALSA_WRITE, MS_ALSA_READ
- ΠΌΠ°ΡΡΠΈΠ½ Π·Π²ΡΠΊ Π½Π° Android (libmedia): MS_ANDROID_SOUND_WRITE, MS_ANDROID_SOUND_READ
- Π£ΡΠ»ΡΠ³Π° Π·Π° Π°ΡΠ΄ΠΈΠΎ ΡΠ΅Π΄ΠΈΡΠΈ (Mac OS X): MS_AQ_WRITE, MS_AQ_READ
- Π£ΡΠ»ΡΠ³Π° Π·Π° Π°ΡΠ΄ΠΈΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ° (Mac OS X)
- Π£ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ (Linux): MS_ARTS_WRITE, MS_ARTS_READ
- DirectSound (Windows): MS_WINSNDDS_WRITE, MS_WINSNDDS_READ
- ΠΠ»Π΅Π΅Ρ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ (raw/wav/pcap-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ) (Linux): MS_FILE_PLAYER
- ΠΠ»Π΅Π΅Ρ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ (raw/wav-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ) (Windows): MS_WINSND_READ
- ΠΠ°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (wav-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ) (Linux): MS_FILE_REC
- ΠΠ°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (wav-Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ) (Windows): MS_WINSND_WRITE
- Mac Π°ΡΠ΄ΠΈΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ° (Mac OS X)
- MME (Windows)
- OSS (Linux): MS_OSS_WRITE, MS_OSS_READ
- PortAudio (Mac OS X)
- PulseAudio (Linux): MS_PULSE_WRITE, MS_PULSE_READ
- ΠΠ²ΡΠΊ Π½Π° Windows (Windows)
ΠΡΠ΄ΠΈΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅
- G.711 a-Π·Π°ΠΊΠΎΠ½: MS_ALAW_DEC, MS_ALAW_ENC
- G.711 Β΅-Π·Π°ΠΊΠΎΠ½: MS_ULAW_DEC, MS_ULAW_ENC
- G.722: MS_G722_DEC, MS_G722_ENC
- G.726: MS_G726_32_ENC, MS_G726_24_ENC, MS_G726_16_ENC
- GSM: MS_GSM_DEC, MS_GSM_ENC
- ΠΠΈΠ½Π΅Π°ΡΠ΅Π½ PCM: MS_L16_ENC, MS_L16_DEC
- Speex: MS_SPEEX_ENC, MS_SPEEX_DEC
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π°ΡΠ΄ΠΈΠΎ
- ΠΠΎΠ½Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΊΠ°Π½Π°Π»ΠΈ (ΠΌΠΎΠ½ΠΎ-> ΡΡΠ΅ΡΠ΅ΠΎ, ΡΡΠ΅ΡΠ΅ΠΎ-> ΠΌΠΎΠ½ΠΎ): MS_CHANNEL_ADAPTER
- ΠΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΡΠ°: MS_CONF
- DTMF Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ: MS_DTMF_GEN
- ΠΡΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° Π΅Ρ ΠΎ (speex): MS_SPEEX_EC
- ΠΠΊΠ²ΠΈΠ»Π°ΡΠ·Π΅Ρ: MS_EQUALIZER
- ΠΠΈΠΊΡΠ΅Ρ: MS_MIXER
- ΠΠΎΠΌΠΏΠ΅Π½Π·Π°ΡΠΎΡ Π·Π° Π·Π°Π³ΡΠ±Π° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ (PLC): MS_GENERIC_PLC
- Π Π΅ΡΠ΅ΠΌΠΏΠ»Π΅Ρ: MS_RESAMPLE
- ΠΠ΅ΡΠ΅ΠΊΡΠΎΡ Π·Π° ΡΠΎΠ½ΠΎΠ²ΠΈ: MS_TONE_DETECTOR
- ΠΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΡΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° Π·Π²ΡΠΊΠΎΡ ΠΈ ΠΌΠ΅ΡΠ΅ΡΠ΅ Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΎΡ: MS_VOLUME
Π€ΠΈΠ»ΡΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎ
Π‘Π½ΠΈΠΌΠ°ΡΠ΅ ΠΈ ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎ
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ ΡΠΎ Android
- ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° Π°Π½Π΄ΡΠΎΠΈΠ΄
- AV Foundation Capture (iOS)
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° AV Foundation (iOS)
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ DirectShow (Windows)
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° DrawDib (Windows)
- ΠΠ°Π΄Π²ΠΎΡΠ΅ΡΠ½Π° ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° - ΠΡΠΏΡΠ°ΡΠ°ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎ Π³ΠΎΡΠ½ΠΈΠΎΡ ΡΠ»ΠΎΡ
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° GLX (Linux): MS_GLXVIDEO
- Mire - Π‘ΠΈΠ½ΡΠ΅ΡΠΈΡΠΊΠ° ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½Π° ΡΠ»ΠΈΠΊΠ°: MS_MIRE
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° OpenGL (Mac OS X)
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° OpenGL ES2 (ΠΠ½Π΄ΡΠΎΠΈΠ΄)
- Quicktime Capture (Mac OS X)
- Π Π΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° Π½Π° SDL: MS_SDL_OUT
- ΠΠ·Π»Π΅Π· Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ»ΠΈΠΊΠΈ: MS_STATIC_IMAGE
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π·Π° Linux (V4L) (Linux): MS_V4L
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π·Π° Linux 2 (V4L2) (Linux): MS_V4L2_CAPTURE
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Video4windows (DirectShow) (Windows)
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Video4windows (DirectShow) (Windows CE)
- Π‘Π½ΠΈΠΌΠ°ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π·Π° Windows (vfw) (Windows)
- XV ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ° (Linux)
ΠΠΈΠ΄Π΅ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅
- H.263, H.263-1998, MP4V-ES, JPEG, MJPEG, ΡΠ½Π΅Π³: MS_MJPEG_DEC, MS_H263_ENC, MS_H263_DEC
- H.264 (ΡΠ°ΠΌΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ): MS_H264_DEC
- Π’Π΅ΠΎΡΠ°: MS_THEORA_ENC, MS_THEORA_DEC
- VP8: MS_VP8_ENC, MS_VP8_DEC
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎ
- jpeg ΡΠ½ΠΈΠΌΠΊΠ°
- ΠΠΎΠ½Π²Π΅ΡΡΠΎΡ Π½Π° ΡΠΎΡΠΌΠ°Ρ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈ: MS_PIX_CONV
- ΠΡΠΎΠΌΠ΅Π½Π° Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ°
- ΠΡΡΠ³ΠΈ ΡΠΈΠ»ΡΡΠΈ
- Π Π°Π·ΠΌΠ΅Π½Π° Π½Π° Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΠΎΠΌΠ΅ΡΡ Π½ΠΈΡΠΊΠΈ: MS_ITC_SOURCE, MS_ITC_SINK
- Π‘ΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²Π»Π΅Π·ΠΎΠ²ΠΈ Π΄ΠΎ Π΅Π΄Π΅Π½ ΠΈΠ·Π»Π΅Π·: MS_JOIN
- RTP ΠΏΡΠΈΠ΅ΠΌ/ΠΏΡΠ΅Π½ΠΎΡ: MS_RTP_SEND, MS_RTP_RECV
- ΠΠΎΠΏΠΈΡΠ°ΡΠ΅ Π½Π° Π²Π»Π΅Π·Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ·Π»Π΅Π·ΠΈ: MS_TEE
- ΠΠ°Π²ΡΡΠ΅Π½ΠΎ ΠΎΠΏΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅: MS_VOID_SINK
- ΠΠ·Π²ΠΎΡ Π½Π° ΡΠΈΡΠΈΠ½Π°: MS_VOID_SOURCE
ΠΠΎΠ΄Π°ΡΠΎΡΠΈ
Π€ΠΈΠ»ΡΡΠΈ Π·Π° Π·Π²ΡΠΊ
- AMR-NB Π΅Π½ΠΊΠΎΠ΄Π΅Ρ/Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ
- G.729 Π΅Π½ΠΊΠΎΠ΄Π΅Ρ/Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ
- iLBC Π΅Π½ΠΊΠΎΠ΄Π΅Ρ/Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ
- SILK Π΅Π½ΠΊΠΎΠ΄Π΅Ρ/Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ
Π€ΠΈΠ»ΡΡΠΈ Π·Π° Π²ΠΈΠ΄Π΅ΠΎ
- H.264 ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΈ Π΅Π½ΠΊΠΎΠ΄Π΅Ρ
- H.264 V4L2 Ρ Π°ΡΠ΄Π²Π΅ΡΡΠΊΠΈ Π·Π°Π±ΡΠ·Π°Π½ Π΅Π½ΠΊΠΎΠ΄Π΅Ρ/Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ
ΠΠΎ ΠΊΡΠ°ΡΠΎΠΊ ΠΎΠΏΠΈΡ Π½Π° ΡΠΈΠ»ΡΠ΅ΡΠΎΡ, ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠΈΠΏΠΎΡ, ΠΊΠΎΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° Π½ΠΎΠ² ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ Π½Π° ΠΎΠ²ΠΎΡ ΡΠΈΠ»ΡΠ΅Ρ. ΠΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΠΎΡΠ²ΡΠ½Π΅ΠΌΠ΅ Π½Π° ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ°.
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ° ΠΏΠΎΠ΄ Linux Ubuntu
Π‘Π΅Π³Π° ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ ΠΈ ΡΠ΅ ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΠΏΡΠ²Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠΎ Π½Π΅Π³ΠΎ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Mediastremer2 Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ ΠΈΠ»ΠΈ Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΡΠΎ Ubuntu Π½Π΅ Π±Π°ΡΠ° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΡΠ΅Π±Π½ΠΈ Π²Π΅ΡΡΠΈΠ½ΠΈ. ΠΠ²Π΄Π΅ ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρ, ΡΠΈΠΌΠ±ΠΎΠ»ΠΎΡ β$β ΡΠ΅ Π³ΠΎ ΠΎΠ·Π½Π°ΡΠΈ ΠΏΡΠΎΠΌΠΏΡΠΎΡ Π·Π° ΡΠΊΠΎΠ»ΠΊΠ° Π·Π° Π²Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. ΠΠ½ΠΈΠ΅. Π°ΠΊΠΎ Π²ΠΎ ΡΠΏΠΈΡΠΎΠΊΠΎΡ Π³ΠΎ Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΎΠ²ΠΎΡ ΡΠΈΠΌΠ±ΠΎΠ» Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ°, ΡΠΎΠ³Π°Ρ ΠΎΠ²Π° Π΅ Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ Π΄Π΅ΠΊΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ Π²ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΡ.
Π‘Π΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π΄Π΅ΠΊΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠ΅ΠΊΠΎΡΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΎΠ²ΠΎΡ Π½Π°ΠΏΠΈΡ, Π²Π°ΡΠΈΠΎΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ ΠΈΠΌΠ° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ libmediastremer-dev
Π‘ΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Π³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΡ ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
$ sudo apt-get update
ΠΠ΅ Π²ΠΈ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ±Π°ΡΠ°Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ; Π²Π½Π΅ΡΠ΅ΡΠ΅ ΡΠ° ΠΈ ΠΌΠ΅Π½Π°ΡΠ΅ΡΠΎΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΠ΅ Π³ΠΈ Π°ΠΆΡΡΠΈΡΠ° ΡΠ²ΠΎΠΈΡΠ΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎ ΠΎΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅:
$ sudo apt-get install libmediastreamer-dev
ΠΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΌΠ°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΡΡΠΈΠΌΠΈΠ½Π³ Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ.
ΠΠΊΡΠΏΠ½Π°ΡΠ° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅Π½ΠΈΡΠ΅ Π΄Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ 35 MB. ΠΠ΅ΡΠ°Π»ΠΈ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
$ dpkg -s libmediastreamer-dev
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ:
Package: libmediastreamer-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 244
Maintainer: Ubuntu Developers <[email protected]>
Architecture: amd64
Source: linphone
Version: 3.6.1-2.5
Depends: libmediastreamer-base3 (= 3.6.1-2.5), libortp-dev
Description: Linphone web phone's media library - development files
Linphone is an audio and video internet phone using the SIP protocol. It
has a GTK+ and console interface, includes a large variety of audio and video
codecs, and provides IM features.
.
This package contains the development libraries for handling media operations.
Original-Maintainer: Debian VoIP Team <[email protected]>
Homepage: http://www.linphone.org/
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π°Π»Π°ΡΠΊΠΈ Π·Π° ΡΠ°Π·Π²ΠΎΡ
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ C ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠΈΠ΄ΡΡΠΆΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ:
$ sudo apt-get install gcc
ΠΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΡΠΎ Π±Π°ΡΠ°ΡΠ΅ Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ:
$ gcc --version
ΠΠ΄Π³ΠΎΠ²ΠΎΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΡΠΏΡΠΈΠ»ΠΈΠΊΠ° Π²Π°ΠΊΠ°:
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ΠΠ·Π³ΡΠ°Π΄Π±Π° ΠΈ Π²ΠΎΠ΄Π΅ΡΠ΅ Π½Π° ΠΏΡΠΎΠ±Π½Π°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°
ΠΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π²ΠΎ Π΄ΠΎΠΌΠ° ΠΏΠ°ΠΏΠΊΠ° Π·Π° Π½Π°ΡΠΈΡΠ΅ ΡΡΡΠΎΡΠΈΡΠ°Π»Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π°ΡΠ΄Π΅ Π΄Π° ΡΠ° Π½Π°ΡΠ΅ΡΠ΅ΠΌΠ΅ mstutorial:
$ mkdir ~/mstutorial
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π³ΠΎ Π²Π°ΡΠΈΠΎΡ ΠΎΠΌΠΈΠ»Π΅Π½ ΡΡΠ΅Π΄ΡΠ²Π°Ρ Π½Π° ΡΠ΅ΠΊΡΡ ΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° C Π½Π°ΡΠ΅ΡΠ΅Π½Π° mstest.Π² ΡΠΎ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°:
#include "stdio.h"
#include <mediastreamer2/mscommon.h>
int main()
{
ms_init();
printf ("Mediastreamer is ready.n");
}
ΠΠΎ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ°ΡΠΈ ΡΠ΅ΡΡΠΈΡΠΊΠ° ΠΈ ΠΈΠ·Π»Π΅Π³ΡΠ²Π°.
ΠΠ°ΡΡΠ²Π°ΡΡΠ΅ ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ ΡΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΡΠ° ΡΠ΅ΡΡ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
$ gcc mstest.c -o mstest `pkg-config mediastreamer --libs --cflags`
ΠΠ΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΈΠΌΠ°ΡΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ°
`pkg-config mediastreamer --libs --cflags`
Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ Π²ΠΎ Π½Π°Π²ΠΎΠ΄Π½ΠΈΡΠΈ, ΠΊΠΎΠΈ ΡΠ΅ Π½Π°ΠΎΡΠ°Π°Ρ Π½Π° ΡΠ°ΡΡΠ°ΡΡΡΠ°ΡΠ° Π½Π° ΠΈΡΡΠΎΡΠΎ ΠΌΠ΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ Π±ΡΠΊΠ²Π°ΡΠ° βYβ.
ΠΠΊΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π½Π΅ ΡΠΎΠ΄ΡΠΆΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΡΠΎΠ³Π°Ρ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ mstest. ΠΠ° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°:
$ ./mstest
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π²Π°ΠΊΠ°:
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4738:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card HDA Intel PCH does not seems to be capable of anything, retrying with plughw...
Mediastreamer is ready.
ΠΠΎ ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ° Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ALSA, ΠΊΠΎΡΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° Π·Π²ΡΡΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ°. Π‘Π°ΠΌΠΈΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈ Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ Π²Π΅ΡΡΠ²Π°Π°Ρ Π΄Π΅ΠΊΠ° ΡΠΎΠ° Π΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π½ΠΈΠ΅ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΡΠΎΠ³Π»Π°ΡΠΈΠΌΠ΅ ΡΠΎ Π½ΠΈΠ².
Π‘Π΅Π³Π° ΡΠΈΡΠ΅ ΡΠΌΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ ΡΠΎ ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ. ΠΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π²ΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈ ΡΡΡΠΈΠΌΠ΅Ρ, Π°Π»Π°ΡΠΊΠ°ΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΏΡΠΎΠ±Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, ΠΏΠΎΡΠ²ΡΠ΄ΠΈΠ²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π°Π»Π°ΡΠΊΠΈΡΠ΅ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ ΠΈ ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈΠΎΡ ΡΡΡΠΈΠΌΠ΅Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°.
ΠΠΎ ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ
ΠΠ·Π²ΠΎΡ: www.habr.com