๊ธ์ ์์ฌ๋ ์ ๊ธ์์ ๊ฐ์ ธ์์ต๋๋ค.
์๊ฐ
์ด ๊ธฐ์ฌ๋ Mediastreamer2 ์์ง์ ์ฌ์ฉํ ์ค์๊ฐ ๋ฏธ๋์ด ์ฒ๋ฆฌ์ ๋ํ ๊ธฐ์ฌ ์๋ฆฌ์ฆ์ ์์์ ๋๋ค. ํ๋ ์ ํ ์ด์ ์๋ Linux ํฐ๋ฏธ๋์์ ์์ ํ๊ณ C ์ธ์ด๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ์ต์ํ์ ๊ธฐ์ ์ด ํฌํจ๋ฉ๋๋ค.
Mediastreamer2๋ ์ธ๊ธฐ ์๋ ์คํ ์์ค ์ํํธ์จ์ด VoIP ์ ํ ํ๋ก์ ํธ์ VoIP ์์ง์
๋๋ค.
๋ํ ํ ์คํธ์์ ํธ์์ Mediastreamer2๋ผ๋ ๋จ์ด ๋์ ๋ฌ์์์ด ํ๊ธฐ๋ฒ์ธ "๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ"๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ฑ ์ด๋ ฅ์ ์์ ํ ๋ช
ํํ์ง ์์ง๋ง ์์ค ์ฝ๋๋ก ํ๋จํ๋ฉด ์ด์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ํต์ฌ์๋ "๋ฐ์ดํฐ ํ๋ฆ"(๋ฐ์ดํฐ ํ๋ฆ)์ด๋ผ๋ ์ํคํ ์ฒ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ํคํ ์ฒ์ ์๊ฐ ์๋ ๊ทธ๋ฆผ์ ๋์ ์์ต๋๋ค.
์ด ์ํคํ ์ฒ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ์๋๋ผ ์์์ ์์๋ก ๋ฐฐ์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ ์ฒด๊ณ(๊ทธ๋ํ)๋ก ์ง์ ๋ฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํํฐ๋ผ๊ณ ํฉ๋๋ค.
์ด ์ํคํ ์ฒ๋ฅผ ํตํด VoIP ์ ํ RTP ํธ๋ํฝ ์ฒ๋ฆฌ ๋ฐ ์ ์ก ์ฒด๊ณ์ ์ฐ๊ฒฐ๋ ์ผ๋ จ์ ํํฐ ํํ๋ก ๋ฏธ๋์ด ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
ํํฐ๋ฅผ ์์์ ์ฒด๊ณ๋ก ๊ฒฐํฉํ๋ ๊ธฐ๋ฅ, ์๋ก์ด ํํฐ์ ๊ฐ๋จํ ๊ฐ๋ฐ, ๋ ๋ฆฝ์ ์ธ ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ๊ตฌํ์ ํตํด ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์์ฒด ์ ์ํ ํํฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ VoIP ๋ถ์ผ์ ํ๋ก์ ํธ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฐ ํ๋ถํ๋ฉฐ ์ด๋ฏธ ์ธ๊ธํ ๋ฐ์ ๊ฐ์ด ์์ฒด ๋์์ธ์ ํํฐ๋ก ํ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋จผ์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ํจ๊ป ์ ๊ณต๋๋ ๊ธฐ์ฑํ ํํฐ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ด๋ ํํฐ
์ค๋์ค ์บก์ฒ ๋ฐ ์ฌ์
- Alsa(๋ฆฌ๋ ์ค): 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(์๋์ฐ์ฆ)
- OSS(๋ฆฌ๋ ์ค): MS_OSS_WRITE, MS_OSS_READ
- PortAudio(Mac OS X)
- PulseAudio(๋ฆฌ๋ ์ค): MS_PULSE_WRITE, MS_PULSE_READ
- Windows ์๋ฆฌ(Windows)
์ค๋์ค ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ
- G.711 ๋ฒ: MS_ALAW_DEC, MS_ALAW_ENC
- G.711 ยต-law: 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
- ์์ฑ: 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
๋น๋์ค ํํฐ
๋น๋์ค ์บก์ฒ ๋ฐ ์ฌ์
- ์๋๋ก์ด๋ ์บก์ฒ
- ์๋๋ก์ด๋ ์ฌ์
- AV ํ์ด๋ฐ์ด์ ์บก์ฒ(iOS)
- AV ํ์ด๋ฐ์ด์ ์ฌ์(iOS)
- DirectShow ์บก์ฒ(Windows)
- DrawDib ์ฌ์(Windows)
- ์ธ๋ถ ์ฌ์ - ์ต์์ ๋ ์ด์ด๋ก ๋น๋์ค ๋ณด๋ด๊ธฐ
- GLX ์ฌ์(Linux): MS_GLXVIDEO
- Mire - ํฉ์ฑ๋์์: MS_MIRE
- OpenGL ์ฌ์(Mac OS X)
- OpenGL ES2 ์ฌ์(Android)
- ํตํ์ ์บก์ฒ(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 ํ๋์จ์ด ๊ฐ์ ์ธ์ฝ๋/๋์ฝ๋
ํํฐ์ ๋ํ ๊ฐ๋จํ ์ค๋ช ๋ค์ ์ ํ ์ด๋ฆ์ด ํ์๋๋ฉฐ ์ด ์ด๋ฆ์ ์ด ํํฐ์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์์์๋ ์ด ๋ชฉ๋ก์ ์ฐธ์กฐํ ๊ฒ์ ๋๋ค.
๋ฆฌ๋ ์ค ์ฐ๋ถํฌ์์ ์ค์น
์ด์ ์ปดํจํฐ์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ๋ฅผ ์ค์นํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํฉ๋๋ค.
Ubuntu๋ฅผ ์คํํ๋ ์ปดํจํฐ ๋๋ ๊ฐ์ ๋จธ์ ์ Mediastremer2๋ฅผ ์ค์นํ๋ ๋ฐ๋ ํน๋ณํ ๊ธฐ์ ์ด ํ์ํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์๋์์ "$" ๊ธฐํธ๋ ๋ช ๋ น ์ ๋ ฅ์ ์ํ ์ ํ๋กฌํํธ๋ฅผ ๋ํ๋ ๋๋ค. ์ ๊ฒ๋ค. ๋ชฉ๋ก์์ ๋ผ์ธ์ ์์ ๋ถ๋ถ์ ์ด ๊ธฐํธ๊ฐ ํ์๋๋ฉด ํฐ๋ฏธ๋์์ ์คํ๋๋ ๋ช ๋ น์ด ํ์๋๋ ๋ผ์ธ์ ๋๋ค.
์ด ๋ฌธ์์ ๋จ๊ณ๋ฅผ ์ํํ๋ ๋์ ์ปดํจํฐ๊ฐ ์ธํฐ๋ท์ ์ก์ธ์คํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
libmediastreamer-dev ํจํค์ง ์ค์น
ํฐ๋ฏธ๋์ ์คํํ๊ณ ๋ค์ ๋ช ๋ น์ ์ ๋ ฅํฉ๋๋ค.
$ sudo apt-get update
๋ณ๊ฒฝ์ ์ํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋๋ฉฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค์์ ์คํํด์ผ ํฉ๋๋ค.
$ sudo apt-get install libmediastreamer-dev
ํ์ํ ์ข ์์ฑ ํจํค์ง์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๊ฐ ์๋์ผ๋ก ๋ค์ด๋ก๋๋๊ณ ์ค์น๋ฉ๋๋ค.
๋ค์ด๋ก๋๋ ์ข ์์ฑ deb ํจํค์ง์ ์ด ํฌ๊ธฐ๋ ์ฝ 35MB์ ๋๋ค. ์ค์น๋ ํจํค์ง์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ ๋ค์ ๋ช ๋ น์ผ๋ก ์ฐพ์ ์ ์์ต๋๋ค.
$ 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.
ํ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ๋ฐ ์คํ
์ฐ๋ฆฌ๋ ์ง ํํ ๋ฆฌ์ผ ํ๋ก์ ํธ์ฉ ํด๋์ ๋๋ค. ์ด๋ฆ์ ์ง์ ํ๊ฒ ์ต๋๋ค. ์ค์ต:
$ mkdir ~/mstutorial
์ข์ํ๋ ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ C ํ๋ก๊ทธ๋จ ํ์ผ์ ๋ง๋ญ๋๋ค. mstest.c ๋ค์ ๋ด์ฉ์ผ๋ก:
#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`
๋ฌธ์ "ะ"์ ๊ฐ์ ์์น์ ํค๋ณด๋์ ์๋ ๋ฐ์ดํ๋ก ๋ฌถ์ฌ ์์ต๋๋ค.
ํ์ผ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ปดํ์ผ ํ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ด ๋ํ๋ฉ๋๋ค. 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 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋๋ฉฐ ์ฌ์ด๋ ์นด๋๋ฅผ ์ ์ดํ๋ โโ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฏธ๋์ด ์ค ํธ๋ฆฌ๋จธ ๊ฐ๋ฐ์๋ ์ด๊ฒ์ด ์ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ๋ง์ง ๋ชปํด ๋์ํฉ๋๋ค.
์ด์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ํจ๊ป ์์ ํ ์ค๋น๊ฐ ๋ชจ๋ ๋๋ฌ์ต๋๋ค. ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ปดํ์ผ ๋๊ตฌ๋ฅผ ์ค์นํ๊ณ ํ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ ๋๊ตฌ๊ฐ ๊ตฌ์ฑ๋๊ณ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๊ธฐํ๋๋์ง ํ์ธํ์ต๋๋ค.
๋ค์
์ถ์ฒ : habr.com