'libsoup'에 해당되는 글 2건
- 2009.01.04 [리눅스 라디오 프로그램 제작기] 2. kbs 온에어 재생 7
- 2009.01.04 [리눅스 라디오 프로그램 제작기] 1. 개요 & 개발 환경 구축 2
[리눅스 라디오 프로그램 제작기] 2. kbs 온에어 재생
Programming 2009. 1. 4. 21:05
리눅스용 라디오 프로그램의 첫 단계로 kbs 라디오 온에어를 재생하는 프로그램을 만들었다. kbs를 먼저 선택한 이유는 이전 글에서도 말했듯이 kbs 온에어는 로그인이 필요하기 때문이다. 텍스트 모드로 작동하며 채널, kbs 사이트 아이디, 패스워드를 argument로 주어 실행하면, 온에어를 재생해주는 간단한 프로그램이다.
프로그램은 크게 두 가지 부분으로 나뉘어 진다. 먼저 kbs 사이트에 로그인한 후 mms url을 얻어오는 부분, 그리고 mms url을 재생하는 부분이다. 이 중에서 mms 재생하는 부분은 GStreamer 매뉴얼의 playbin 항목을 참고했다. 볼륨 조절이나 정지/재생 기능은 일단 고려하지 않고 단순히 재생하는 데만 초점을 맞추었기 때문에 예제 코드를 거의 그대로 갖다 썼다.
kbs 사이트에 로그인하는 부분은 조금 삽질이 필요했다. 파이어폭스 확장 기능인 httpfox를 사용하여 로그인부터 온에어 url이 전송되는 부분까지 거쳐 가는 페이지들을 추적했다. 서버 단에서 일어나는 일들을 정확히 알 수 없었기 때문에 httpfox에서 보이는 http request/response를 보고 추측해야 했다. 이렇게 알아낸 것들을 바탕으로 libsoup 라이브러리를 사용하여 http request를 보내고 response를 받으며 mms url이 나올 때까지 계속해 갔다. 그리고 이 과정에서 쿠키에 저장되는 정보가 있는데 request를 보낼 때 설정해 주어야 했다. 이런식으로 로그인부터 mms url을 얻어오는 데 성공하기 까지 며칠은 걸린 것 같다. libsoup 튜토리얼이라도 있었으면 좀 쉽게 했을텐데...
어쨌듯 온에어를 재생하는 데 성공했으니 이제 다음으로 GUI를 붙여 봐야 겠다.
소스 설명
get_url.h, get_url.c : kbs 사이트에 로그인하고 mms url을 얻어오는 코드(libsoup 사용)
player.h, player.c : mms url을 재생하는 코드(GStreamer 사용)
main.c : 말 그대로 메인
이번에 사용한 GStreamer 코드는 얼마되지 않는다. 위에서도 말했듯이 playbin 코드를 많이 참고하였고, 필요한 부분만 뽑았기 때문에 간단하다.
libsoup 사용 부분은 조금 길긴 하지만 HTML 폼 파라미터 처리가 필요하고 http request를 여러 번 주고 받아야 되어서 길어졌을 뿐, 실제로 사용한 libsoup 함수는 몇 가지 안된다.
컴파일 및 실행 방법
※ 이전 글에서 설명한 개발 라이브러리들이 설치되어 있어야 컴파일이 된다.
프로그램은 크게 두 가지 부분으로 나뉘어 진다. 먼저 kbs 사이트에 로그인한 후 mms url을 얻어오는 부분, 그리고 mms url을 재생하는 부분이다. 이 중에서 mms 재생하는 부분은 GStreamer 매뉴얼의 playbin 항목을 참고했다. 볼륨 조절이나 정지/재생 기능은 일단 고려하지 않고 단순히 재생하는 데만 초점을 맞추었기 때문에 예제 코드를 거의 그대로 갖다 썼다.
kbs 사이트에 로그인하는 부분은 조금 삽질이 필요했다. 파이어폭스 확장 기능인 httpfox를 사용하여 로그인부터 온에어 url이 전송되는 부분까지 거쳐 가는 페이지들을 추적했다. 서버 단에서 일어나는 일들을 정확히 알 수 없었기 때문에 httpfox에서 보이는 http request/response를 보고 추측해야 했다. 이렇게 알아낸 것들을 바탕으로 libsoup 라이브러리를 사용하여 http request를 보내고 response를 받으며 mms url이 나올 때까지 계속해 갔다. 그리고 이 과정에서 쿠키에 저장되는 정보가 있는데 request를 보낼 때 설정해 주어야 했다. 이런식으로 로그인부터 mms url을 얻어오는 데 성공하기 까지 며칠은 걸린 것 같다. libsoup 튜토리얼이라도 있었으면 좀 쉽게 했을텐데...
어쨌듯 온에어를 재생하는 데 성공했으니 이제 다음으로 GUI를 붙여 봐야 겠다.
소스 설명
get_url.h, get_url.c : kbs 사이트에 로그인하고 mms url을 얻어오는 코드(libsoup 사용)
player.h, player.c : mms url을 재생하는 코드(GStreamer 사용)
main.c : 말 그대로 메인
이번에 사용한 GStreamer 코드는 얼마되지 않는다. 위에서도 말했듯이 playbin 코드를 많이 참고하였고, 필요한 부분만 뽑았기 때문에 간단하다.
libsoup 사용 부분은 조금 길긴 하지만 HTML 폼 파라미터 처리가 필요하고 http request를 여러 번 주고 받아야 되어서 길어졌을 뿐, 실제로 사용한 libsoup 함수는 몇 가지 안된다.
soup_session_sync_new(); // soup session을 생성
soup_message_new(); // http request를 생성
soup_message_set_request(); // 폼 데이터와 함께 POST request를 보낼 때 사용
soup_session_send_message(); // http request를 보냄
soup_message_headers_append(); // http 헤더 셋팅(kbs 사이트에 referer를 체크하는 부분이 있어 사용했다.)
soup_cookies_to_request(); // request에 쿠키를 포함할 때 사용
soup_message_set_request(); // 폼 데이터와 함께 POST request를 보낼 때 사용
soup_session_send_message(); // http request를 보냄
soup_message_headers_append(); // http 헤더 셋팅(kbs 사이트에 referer를 체크하는 부분이 있어 사용했다.)
soup_cookies_to_request(); // request에 쿠키를 포함할 때 사용
컴파일 및 실행 방법
※ 이전 글에서 설명한 개발 라이브러리들이 설치되어 있어야 컴파일이 된다.
young@y0un5:~/Study/onair$ tar xzvf onair.tar.gz
./Makefile
./get_url.c
./get_url.h
./main.c
./onair
./player.c
./player.h
young@y0un5:~/Study/onair$ ls
Makefile get_url.c get_url.h main.c onair onair.tar.gz player.c player.h
young@y0un5:~/Study/onair$ make
gcc -o onair main.c get_url.c player.c `pkg-config --cflags --libs libsoup-2.4 gstreamer-0.10`
young@y0un5:~/Study/onair$
young@y0un5:~/Study/onair$ ./onair [채널 - 1AM, 2FM 등] [kbs 사이트 ID] [패스워드]
[DEBUG] Dest URL : L_2FM
[DEBUG] got onair url : mms://211.233.92.42/L_2FM?[ID]
[DEBUG] now play mms://211.233.92.42/L_2FM?[ID]
./Makefile
./get_url.c
./get_url.h
./main.c
./onair
./player.c
./player.h
young@y0un5:~/Study/onair$ ls
Makefile get_url.c get_url.h main.c onair onair.tar.gz player.c player.h
young@y0un5:~/Study/onair$ make
gcc -o onair main.c get_url.c player.c `pkg-config --cflags --libs libsoup-2.4 gstreamer-0.10`
young@y0un5:~/Study/onair$
young@y0un5:~/Study/onair$ ./onair [채널 - 1AM, 2FM 등] [kbs 사이트 ID] [패스워드]
[DEBUG] Dest URL : L_2FM
[DEBUG] got onair url : mms://211.233.92.42/L_2FM?[ID]
[DEBUG] now play mms://211.233.92.42/L_2FM?[ID]
[리눅스 라디오 프로그램 제작기] 1. 개요 & 개발 환경 구축
Programming 2009. 1. 4. 14:20
요즘 예전부터 생각해 왔던 리눅스용 라디오 프로그램을 만들고 있다. 나중에 또 다시 삽질하는 것도 방지하고 혹시나 참고하실 분들이 있을까 싶어 여기에 차근차근 정리해 가면서 진행하려고 한다.
개발 목적
이 프로젝트의 목적은 간단하다. 리눅스에서 간편하게 쓸 수 있는 GUI 라디오 프로그램을 만드는 것이다. kbs의 콩, mbc의 미니, sbs의 고릴라 등의 리눅스 버전이라 생각하면 되겠다. mbc, sbs 등 스트리밍 url이 공개되어 있고 로그인하지 않아도 되는 것들은 바로 그 url을 재생하고 kbs처럼 로그인이 필요한 것은 사이트에 직접 접속하여 스트리밍 url을 얻어와 재생하는 방식으로 구현할 것이다. (사실 이 프로그램을 만들기로 결심한 것은 kbs 때문이다. 공개된 url은 없고, 사이트에서도 온에어 링크가 잘 작동이 안되었기 때문이다. 그런데 어제 다시 kbs 사이트에서 온에어를 실행해보니 팝업 차단을 하면 잘된다..ㅡㅡ; 뭐, 그래도 일단 시작한 것이니 계속 진행 해 봐야지...)
기능
기능은 별 거 없다. 일단 생각하고 있는 것은 이 정도...
1. kbs, mbc, sbs 라디오 채널 재생
2. 기타 채널 추가 기능
3. 녹음 기능
4. 예약 기능
5. 프로그램 정보 읽어 오기
개발 환경
이 참에 GNOME 어플리케이션 공부도 할 겸 개발 환경은 GNOME을 선택했다. 그리고 스트리밍 재생을 위한 프레임워크로는 GStreamer를, HTTP 클라이언트로는 libsoup를 사용하기로 했다. GUI는 일단 Gtk+로 만들고 나중에 GNOME 어플리케이션으로 변경해 보려 한다.
개발 환경 구축
■ Gtk+ 개발 관련 패키지 설치
먼저 Gtk+로 개발할 때 필요한 파일들이 포함된 libgtk2.0-dev 패키지(및 의존성 걸리는 패키지들)를 설치한다. 설치 후 다음 명령을 실행했을 때 아래와 같이 인클루드 경로와 링크 플래그가 나와야 한다. 이 정보는 gcc로 gtk+ 프로그램을 컴파일할 때 사용된다.
Gtk+ 컴파일도 해보고 예제 참고도 할 겸, gtk2.0-examples 패키지도 설치한다. 이 패키지를 설치하면
/usr/share/doc/gtk2.0-examples/examples/에 예제 소스가 Makefile과 함께 설치된다.
/usr/share/doc/gtk2.0-examples/examples/helloworld$에 helloworld.c 소스 파일이 있다. make를 실행하면 문제 없이 컴파일 되어야 한다(디렉토리 쓰기 권한이 root로 되어 있다는 것에 주의). Makefile을 열어 보면 pkg-config로 얻은 정보가 컴파일 시 사용되는 것을 볼 수 있다.
vim 플러그인 gtk-vim-syntax도 설치하면 vim으로 작업하기 편하다. 당분간은 에디터로 vim을 쓸 것이기 때문에 이 플러그인도 설치하는 게 좋다. 설치 방법은 간단하다. 파일을 다운 받아 "~/.vim/after/syntax/"에 압축을 푼 후 c.vim.example 파일을 c.vim으로 변경하면 된다.
■ GStreamer 개발 패키지 설치
스트리밍 재생 기능을 구현하기 위해 GStreamer 개발 패키지를 설치한다. libgstreamer0.10-dev 패키지를 설치하고 이번에도 pkg-config를 실행하여 그 결과를 확인해 본다.
GStreamer 튜토리얼 사이트에 나온 helloworld 예제가 제대로 컴파일 되고 실행되는 지 확인해 본다.
■ libsoup 개발 패키지 설치
사실 이 라이브러리는 온에어 방송을 듣는 데 필요 없지만 kbs는 사이트 로그인 후에만 스트리밍 재생이 되도록 되어 있기 때문에 HTTP 클라이언트 기능이 있어야 한다. HTTP 클라이언트 라이브러리로 libsoup를 택한 것은 별 다른 이유는 없고 GNOME Development Reference 사이트에 나와 있어서 그냥 쓰기로 했다. libsoup2.4-dev 패키지를 설치하고 역시 pkg-config를 실행하여 제대로 나오는 지 확인해 본다.
이제 IDE를 제외한 개발 환경은 모두 구축되었다. Anjuta IDE는 나중에 GUI를 만들 때 설치하기로 하고, 이제 Gtk+, GStreamer, libsoup를 공부해야 할 시간이다.
※ 참고 사이트
개발 목적
이 프로젝트의 목적은 간단하다. 리눅스에서 간편하게 쓸 수 있는 GUI 라디오 프로그램을 만드는 것이다. kbs의 콩, mbc의 미니, sbs의 고릴라 등의 리눅스 버전이라 생각하면 되겠다. mbc, sbs 등 스트리밍 url이 공개되어 있고 로그인하지 않아도 되는 것들은 바로 그 url을 재생하고 kbs처럼 로그인이 필요한 것은 사이트에 직접 접속하여 스트리밍 url을 얻어와 재생하는 방식으로 구현할 것이다. (사실 이 프로그램을 만들기로 결심한 것은 kbs 때문이다. 공개된 url은 없고, 사이트에서도 온에어 링크가 잘 작동이 안되었기 때문이다. 그런데 어제 다시 kbs 사이트에서 온에어를 실행해보니 팝업 차단을 하면 잘된다..ㅡㅡ; 뭐, 그래도 일단 시작한 것이니 계속 진행 해 봐야지...)
기능
기능은 별 거 없다. 일단 생각하고 있는 것은 이 정도...
1. kbs, mbc, sbs 라디오 채널 재생
2. 기타 채널 추가 기능
3. 녹음 기능
4. 예약 기능
5. 프로그램 정보 읽어 오기
개발 환경
이 참에 GNOME 어플리케이션 공부도 할 겸 개발 환경은 GNOME을 선택했다. 그리고 스트리밍 재생을 위한 프레임워크로는 GStreamer를, HTTP 클라이언트로는 libsoup를 사용하기로 했다. GUI는 일단 Gtk+로 만들고 나중에 GNOME 어플리케이션으로 변경해 보려 한다.
OS : Ubuntu 8.10 x86 / GNOME
Tool : vim / gcc / Anjuta
GUI : Gtk+ (추후 GNOME 어플리케이션으로 변경)
멀티미디어 프레임워크 : GStreamer
HTTP 클라이언트 : libsoup
Tool : vim / gcc / Anjuta
GUI : Gtk+ (추후 GNOME 어플리케이션으로 변경)
멀티미디어 프레임워크 : GStreamer
HTTP 클라이언트 : libsoup
개발 환경 구축
■ Gtk+ 개발 관련 패키지 설치
먼저 Gtk+로 개발할 때 필요한 파일들이 포함된 libgtk2.0-dev 패키지(및 의존성 걸리는 패키지들)를 설치한다. 설치 후 다음 명령을 실행했을 때 아래와 같이 인클루드 경로와 링크 플래그가 나와야 한다. 이 정보는 gcc로 gtk+ 프로그램을 컴파일할 때 사용된다.
young@y0un5:~$ pkg-config --cflags --libs gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0
young@y0un5:~$
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lz -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0
young@y0un5:~$
Gtk+ 컴파일도 해보고 예제 참고도 할 겸, gtk2.0-examples 패키지도 설치한다. 이 패키지를 설치하면
/usr/share/doc/gtk2.0-examples/examples/에 예제 소스가 Makefile과 함께 설치된다.
/usr/share/doc/gtk2.0-examples/examples/helloworld$에 helloworld.c 소스 파일이 있다. make를 실행하면 문제 없이 컴파일 되어야 한다(디렉토리 쓰기 권한이 root로 되어 있다는 것에 주의). Makefile을 열어 보면 pkg-config로 얻은 정보가 컴파일 시 사용되는 것을 볼 수 있다.
young@y0un5:/usr/share/doc/gtk2.0-examples/examples/helloworld$ cat Makefile
CC = gcc
CFLAGS = -Wall \
-DG_DISABLE_DEPRECATED \
-DGDK_DISABLE_DEPRECATED \
-DGDK_PIXBUF_DISABLE_DEPRECATED \
-DGTK_DISABLE_DEPRECATED
helloworld: helloworld.c
$(CC) helloworld.c -o helloworld $(CFLAGS) `pkg-config gtk+-2.0 --cflags --libs`
clean:
rm -f *.o helloworld
young@y0un5:/usr/share/doc/gtk2.0-examples/examples/helloworld$
CC = gcc
CFLAGS = -Wall \
-DG_DISABLE_DEPRECATED \
-DGDK_DISABLE_DEPRECATED \
-DGDK_PIXBUF_DISABLE_DEPRECATED \
-DGTK_DISABLE_DEPRECATED
helloworld: helloworld.c
$(CC) helloworld.c -o helloworld $(CFLAGS) `pkg-config gtk+-2.0 --cflags --libs`
clean:
rm -f *.o helloworld
young@y0un5:/usr/share/doc/gtk2.0-examples/examples/helloworld$
vim 플러그인 gtk-vim-syntax도 설치하면 vim으로 작업하기 편하다. 당분간은 에디터로 vim을 쓸 것이기 때문에 이 플러그인도 설치하는 게 좋다. 설치 방법은 간단하다. 파일을 다운 받아 "~/.vim/after/syntax/"에 압축을 푼 후 c.vim.example 파일을 c.vim으로 변경하면 된다.
■ GStreamer 개발 패키지 설치
스트리밍 재생 기능을 구현하기 위해 GStreamer 개발 패키지를 설치한다. libgstreamer0.10-dev 패키지를 설치하고 이번에도 pkg-config를 실행하여 그 결과를 확인해 본다.
young@y0un5:~$ pkg-config --cflags --libs gstreamer-0.10
-pthread -I/usr/include/gstreamer-0.10 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lxml2 -lglib-2.0
young@y0un5:~$
-pthread -I/usr/include/gstreamer-0.10 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lxml2 -lglib-2.0
young@y0un5:~$
GStreamer 튜토리얼 사이트에 나온 helloworld 예제가 제대로 컴파일 되고 실행되는 지 확인해 본다.
young@y0un5:~$ gcc helloworld.c -o helloworld `pkg-config --cflags --libs gstreamer-0.10`
■ libsoup 개발 패키지 설치
사실 이 라이브러리는 온에어 방송을 듣는 데 필요 없지만 kbs는 사이트 로그인 후에만 스트리밍 재생이 되도록 되어 있기 때문에 HTTP 클라이언트 기능이 있어야 한다. HTTP 클라이언트 라이브러리로 libsoup를 택한 것은 별 다른 이유는 없고 GNOME Development Reference 사이트에 나와 있어서 그냥 쓰기로 했다. libsoup2.4-dev 패키지를 설치하고 역시 pkg-config를 실행하여 제대로 나오는 지 확인해 본다.
이제 IDE를 제외한 개발 환경은 모두 구축되었다. Anjuta IDE는 나중에 GUI를 만들 때 설치하기로 하고, 이제 Gtk+, GStreamer, libsoup를 공부해야 할 시간이다.
※ 참고 사이트
Gtk+ 2.0 Tutorial : http://library.gnome.org/devel/gtk-tutorial/stable/
libsoup Reference Manual : http://library.gnome.org/devel/libsoup/stable/
GStreamer Application Development Manual : http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html
libsoup Reference Manual : http://library.gnome.org/devel/libsoup/stable/
GStreamer Application Development Manual : http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html