강좌 & 팁
4월에 발매할 ARM PC-V210 으로 MP3 스트리밍 서비스를 하였던것을 가지고, G100-S5PV210 보드에서 작업을 해보도록 하겠습니다.
이전 글인 음악방송! 나도 할 수 있다! : icecast
을 이용하여 생성한 icecast 실행 파일과, icegenerator 실행 파일 기타 라이브러리 파일들을 이용하여, G100-S5PV210 보드에서도 음악 방송을 해보도록 하겠습니다.
ARM PC-V210 를 이용하여 컴파일된 바이너리와 라이브러리를 이용한다는 전제 하에 글을 작성 하도록 하겠습니다.
G100 보드에서 동작을 시키기 위해서는 ARM PC를 이용하여 계속 작업을 진행 하도록 하겠습니다.
G100 보드에 동작 시키기 위한 파일들을 위치하는 기본 디렉토리는 /nfs/mp3broad 라는 디렉토리를 만들고 여기를 작업 디렉토리로 하겠습니다.
# mkdir <meta http-equiv="content-type" content="text/html; charset=utf-8">/nfs/mp3broad/
실행 파일인 icecast, icegenerator 파일을 ARM PC의 /nfs/mp3broad/prg 디렉토리에 복사를 합니다.
# mkdir /nfs/mp3broad/prg/ # cp icecast /nfs/mp3broad/prg/. # cp icegenerator /nfs/mp3broad/prg/. |
또한, icecast, icegenerator 파일을 G100 보드에서 정상적으로 동작 시키기 위해서는 여러가지 라이브러리가 필요 합니다.
각각의 프로그램이 어떠한 라이브러가 필요한지 알아 보기 위하여, ARM PC 에서 ldd 명령을 사용하여, 사용하는 라이브러리를 확인해 보도록 하겠습니다.
# ldd /nfs/mp3broad/prg/icecast libvorbis.so.0 => /usr/lib/libvorbis.so.0 (0x2aabb000) libxslt.so.1 => /usr/lib/libxslt.so.1 (0x2aae5000) libxml2.so.2 => /usr/lib/libxml2.so.2 (0x2ab16000) libpthread.so.0 => /lib/arm-linux-gnueabi/libpthread.so.0 (0x2abec000) libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0x2ac00000) /lib/ld-linux.so.3 (0x54aaa000) libogg.so.0 => /usr/lib/libogg.so.0 (0x2ace2000) libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0x2acef000) libdl.so.2 => /lib/arm-linux-gnueabi/libdl.so.2 (0x2ad5c000) libz.so.1 => /lib/arm-linux-gnueabi/libz.so.1 (0x2ad67000) # ldd /nfs/mp3broad/prg/icegenerator librt.so.1 => /lib/arm-linux-gnueabi/librt.so.1 (0x2aabb000) libshout.so.3 => /usr/lib/libshout.so.3 (0x2aac9000) libvorbis.so.0 => /usr/lib/libvorbis.so.0 (0x2aae2000) libogg.so.0 => /usr/lib/libogg.so.0 (0x2ab0c000) libstdc++.so.6 => /usr/lib/arm-linux-gnueabi/libstdc++.so.6 (0x2ab19000) libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0x2abc5000) libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0x2ac31000) libpthread.so.0 => /lib/arm-linux-gnueabi/libpthread.so.0 (0x2ac43000) libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0x2ac57000) /lib/ld-linux.so.3 (0x54aaa000) libtheora.so.0 => /usr/lib/libtheora.so.0 (0x2ad39000) libspeex.so.1 => /usr/lib/libspeex.so.1 (0x2ad7e000) |
각각의 프로그램에서 필요한 라이브러리들이 icecast 프로그램은 10개, icegenerator 는 12개의 라이브러리를 참조 하고 있음을 확인 할 수 있습니다.
이중 G100-S5PV210 보드에 포함되어 있는 라이브러리도 있으니 보드에 가지고 와야할 라이브러리 들만 따로 모아서 /nfs/mp3broad/lib 디렉토리에 복사를 하도록 하겠습니다.
따로 필요한 라이브러리 파일은 목록은 다음과 같습니다.
/usr/lib/libvorbis.so.0.4.5 /usr/lib/libxslt.so.1.1.26 /usr/lib/libxml2.so.2.7.8 /usr/lib/libogg.so.0.7.0 /usr/lib/libshout.so.3.2.0 /usr/lib/libvorbis.so.0.4.5 /usr/lib/libtheora.so.0.3.10 /usr/lib/libspeex.so.1.5.0 /lib/arm-linux-gnueabi/libz.so.1.2.3.4 |
이상의 라이브러리 파일을 /nfs/mp3broad/lib/ 디렉토리에 복사를 합니다.
# mkdir /nfs/mp3broad/lib/ # cp /usr/lib/libvorbis.so.0.4.5 /nfs/mp3broad/lib/. # cp /usr/lib/libxslt.so.1.1.26 /nfs/mp3broad/lib/. # cp /usr/lib/libxml2.so.2.7.8 /nfs/mp3broad/lib/. # cp /usr/lib/libogg.so.0.7.0 /nfs/mp3broad/lib/. # cp /usr/lib/libshout.so.3.2.0 /nfs/mp3broad/lib/. # cp /usr/lib/libvorbis.so.0.4.5 /nfs/mp3broad/lib/. # cp /usr/lib/libtheora.so.0.3.10 /nfs/mp3broad/lib/. # cp /usr/lib/libspeex.so.1.5.0 /nfs/mp3broad/lib/. # cp /lib/arm-linux-gnueabi/libz.so.1.2.3.4 /nfs/mp3broad/lib/. |
G100 보드에서 스트리밍 서비스를 하기 위해서는 음원파일(mp3)이 필요 합니다.
G100 보드에 음원파일은 /app/mp3 라는 디렉토리를 만들고 그 안에 음원 파일을 복사 하도록 하겠습니다.
음원 파일의 이름은 임시로 다음과 같이 하도록 합니다.
# mkdir /nfs/mp3broad/mp3/ # cp /home/falinux/mp3/001.mp3 /nfs/mp3broad/mp3/. # cp /home/falinux/mp3/002.mp3 /nfs/mp3broad/mp3/. # cp /home/falinux/mp3/003.mp3 /nfs/mp3broad/mp3/. # cp /home/falinux/mp3/004.mp3 /nfs/mp3broad/mp3/. # cp /home/falinux/mp3/005.mp3 /nfs/mp3broad/mp3/. # cp /home/falinux/mp3/006.mp3 /nfs/mp3broad/mp3/. |
스트리밍 서비스를 운영하기 위해서 설정 파일이 필요 합니다.
설정파일은 기존의 ARM PC 에서 사용하는 설정 파일을 수정하여 사용을 합니다.
일단 기존의 설정파일을 복사 해 온 후 설정 파일의 내용을 수정하도록 하겠습니다.
# mkdir /nfs/mp3broad/etc/ # /usr/local/etc/icecast.xml /nfs/mp3broad/etc/. # /usr/local/etc/icegen1.cfg /nfs/mp3broad/etc/. # /usr/local/etc/playlist2.m3u /nfs/mp3broad/etc/. |
<meta http-equiv="content-type" content="text/html; charset=utf-8">
설정파일(icecast.xml)의 내용을 다음과 같이 수정 합니다.
<icecast> <!-- LIMITS --> <limits> <clients>100</clients> <sources>10</sources> <threadpool>5</threadpool> <queue-size>524288</queue-size> <client-timeout>30</client-timeout> <header-timeout>15</header-timeout> <source-timeout>10</source-timeout> <burst-on-connect>1</burst-on-connect> <burst-size>65535</burst-size> </limits> <!-- GENRIC --> <authentication> <source-password>password</source-password> <admin-user>admin</admin-user> <admin-password>password</admin-password> </authentication> <hostname>MyHost/IP</hostname> <listen-socket> <port>8000</port> </listen-socket> <fileserve>1</fileserve> <!-- PATHES --> <paths> <!-- <basedir>/usr/local/share/icecast</basedir> --> <!-- <webroot>/usr/local/share/icecast/web</webroot> --> <!-- <adminroot>/usr/local/share/icecast/admin</adminroot> --> <logdir>/var/log/icecast</logdir> <pidfile>/var/run/icecast/icecast.pid</pidfile> <alias source="/" dest="/status.xsl"/> </paths> <!-- LOG --> <logging> <accesslog>access.log</accesslog> <errorlog>error.log</errorlog> <playlistlog>playlist.log</playlistlog> <loglevel>1</loglevel> <logsize>10000</logsize> <logarchive>1</logarchive> </logging> <!-- SECURITY --> <security> <chroot>0</chroot> <changeowner> <user>root</user> <group>root</group> </changeowner> </security> </icecast> |
설정파일(icegen1.cfg)의 내용을 다음과 같이 수정 합니다.
자신의 설정에 맞게 IP와 MOUNT, MP3PATH, URL 등의 값을 수정 합니다.
만이 설정파일의 내용중 맞지 않는 부분이 있을 경우 Segmentatation Fault 가 발생 할 수도 있습니다.
IP=192.168.10.210 PORT=8000 SERVER=2 MOUNT=/mp3 PASSWORD=password FORMAT=1 MP3PATH=m3u:/app/etc/playlist2.m3u LOOP=1 SHUFFLE=1 NAME=RadioStation 2: MP3 DESCRIPTION=Test Radio GENRE=Varios URL=http://192.168.10.210:8000 LOG=2 LOGPATH=/var/log/icecast/icegen1.log BITRATE=48000 SOURCE=source |
설정파일(playlist2.m3u)의 내용을 다음과 같이 수정 합니다.
자신의 음원 파일의 위치와 맞게끔 리스트 파일을 작성 합니다.
/app/mp3/001.mp3 /app/mp3/002.mp3 /app/mp3/003.mp3 /app/mp3/004.mp3 /app/mp3/005.mp3 /app/mp3/006.mp3 |
이제 실제 G100 보드에서의 작업을 진행 하도록 하겠습니다.
우선 G100 보드를 부팅 시킨 후, 다음과 같이 root로 로그인을 합니다.
Welcome to FALinux (www.falinux.com) Linux Kernel 2.6.35-falinux falinux login: root [root@falinux ~]$ |
[root@falinux ~]$ ./nfsmnt 192.168.4.43 >> 192.168.4.43 [root@falinux ~]$ |
마운트가 끝난 후 실행 파일을 먼저 /app 디렉토리로 복사를 합니다.
[root@falinux ~]$ cp /nfs/mp3broad/prg/icecast /app/. [root@falinux ~]$ cp /nfs/mp3broad/prg/icegenerator /app/. |
실행 파일의 복사가 끝난 후, 다음의 라이브러리 파일을 /usr/lib/ 디렉토리로 복사를 합니다.
[root@falinux ~]$ cp /nfs/mp3broad/lib/libvorbis.so.0.4.5 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libxslt.so.1.1.26 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libxml2.so.2.7.8 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libogg.so.0.7.0 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libshout.so.3.2.0 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libvorbis.so.0.4.5 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libtheora.so.0.3.10 /usr/lib/. [root@falinux ~]$ cp /nfs/mp3broad/lib/libspeex.so.1.5.0 /usr/lib/. <meta http-equiv="content-type" content="text/html; charset=utf-8">
|
[rot@falinux lib]$ cd /usr/lib/ [root@falinux lib]$ ln -s libvorbis.so.0.4.5 libvorbis.so.0 [root@falinux lib]$ ln -s libxslt.so.1.1.26 libxslt.so.1 [root@falinux lib]$ ln -s libxml2.so.2.7.8 libxml2.so.2 [root@falinux lib]$ ln -s libogg.so.0.7.0 libogg.so.0 [root@falinux lib]$ ln -s libshout.so.3.2.0 libshout.so.3 [root@falinux lib]$ ln -s libtheora.so.0.3.10 libtheora.so.0 [root@falinux lib]$ ln -s libspeex.so.1.5.0 libspeex.so.1 |
root@falinux ~]$ mkdir /app/etc [root@falinux ~]$ mkdir /app/mp3 [root@falinux ~]$ cp -a /nfs/mp3broad/etc/* /app/etc/. [root@falinux ~]$ cp -a /nfs/mp3broad/mp3/* /app/mp3/. |
[root@falinux ~]$ adduser icecast Changing password for icecast New password: Bad password: similar to username Retype password: Password for icecast changed by root [root@falinux ~]$ mkdir /var/log/icecast [root@falinux ~]$ chown icecast.icecast /var/log/icecast |
[root@falinux app]$ /app/icecast -c /app/etc/icecast.xml -b /app/icecast: /lib/libz.so.1: no version information available (required by /usr/lib/l) Starting icecast2 Detaching from the console /app/icecast: symbol lookup error: /usr/lib/libxml2.so.2: undefined symbol: gzopen64 |
실행시 위와 같은 에러가 발생 하게 되며, 이것은 현재 보드의 libz 라이브러리와 icecast 에서 사용했던 라이브러리가
맞지 않아서 발생 하는 에러 입니다. 이를 위하여 기존의 라이브러리를 ARM PC 에서 가져온 새로운 라이브러리로 대체 합니다.
다음과 같이 libz 관련 라이브러리를 복사 하고 링크를 다시 잡아 줍니다.
[rot@falinux lib]$ cp /app/lib/libz.so.1.2.3.4 . [root@falinux lib]$ ls -al libz.so* lrwxrwxrwx 1 root root 13 Jun 7 2012 libz.so -> libz.so.1.2.3 lrwxrwxrwx 1 root root 13 Jun 7 2012 libz.so.1 -> libz.so.1.2.3 -rwxr-xr-x 1 root root 76500 May 29 2009 libz.so.1.2.3 -rw-r--r-- 1 root root 71352 Jan 1 01:15 libz.so.1.2.3.4 [root@falinux lib]$ rm -rf libz.so.1 [root@falinux lib]$ ln -s libz.so.1.2.3.4 libz.so.1 |
다시 icecast 를 실행 합니다.
[root@falinux lib]$ /app/icecast -c /app/etc/icecast.xml -b Starting icecast2 Detaching from the console I/O warning : failed to load external entity "./etc/icecast.xml" FATAL: error parsing config file (./etc/icecast.xml) XML config parsing error [root@falinux lib]$ /app/icecast -c /app/etc/icecast.xml -b Starting icecast2 Detaching from the console Changed groupid to 0. Changed userid to 0. ERROR: You should not run icecast2 as root Use the changeowner directive in the config file |
실행시 위와 같은 에러가 발생 합니다.
이 에러는 icecast 사용자로 실행을 시켜주어야 하는데 root 사용자로 실행을 했기 때문에 발생 하는 에러 입니다.
다음과 같이 사용자를 root 에서 icecast로 변경 합니다.
[root@falinux lib]$ su - icecast |
변경한 icecast 사용자로 다시 실행을 합니다.
[icecast@falinux ~]$ /app/icecast -c /app/etc/icecast.xml -b Starting icecast2 Detaching from the console WARNING: Can't change user id unless you are root. [icecast@falinux ~]$ ps PID USER VSZ STAT COMMAND 1 root 1600 S init [3] 2 root 0 SW [kthreadd] 3 root 0 SW [ksoftirqd/0] 4 root 0 SW [watchdog/0] 5 root 0 SW [events/0] 6 root 0 SW [khelper] 10 root 0 SW [async/mgr] 135 root 0 SW [sync_supers] 137 root 0 SW [bdi-default] 138 root 0 SW [kblockd/0] 145 root 0 SW [khubd] 148 root 0 SW [kseriod] 157 root 0 SW [kmmcd] 168 root 0 SW [cfg80211] 181 root 0 SW [rpciod/0] 193 root 0 SW [khungtaskd] 194 root 0 SW [kswapd0] 241 root 0 SW [aio/0] 246 root 0 SW [nfsiod] 249 root 0 SW [crypto/0] 872 root 0 SW [mtdblock0] 877 root 0 SW [mtdblock1] 882 root 0 SW [mtdblock2] 890 root 0 SW [libertastf/0] 1091 root 2920 S /usr/sbin/telnetd 1113 root 0 SW [yaffs-bg] 1123 root 2920 S syslogd -m 0 1206 root 2436 S -bash 1267 root 0 SW [flush-1:0] 1285 icecast 2940 S -sh 1290 icecast 5004 S /app/icecast -c /app/etc/icecast.xml -b 1293 icecast 2924 R ps |
[icecast@falinux ~]$ /app/icegenerator -f /app/etc/icegen1.cfg [icecast@falinux ~]$ ps PID USER VSZ STAT COMMAND 1290 icecast 6028 S /app/icecast -c /app/etc/icecast.xml -b 1297 icecast 28612 S /app/icegenerator -f /app/etc/icegen1.cfg 1302 icecast 2924 R ps [icecast@falinux ~]$ cat /var/log/icecast/icegen1.log Thu Jan 1 01:17:39 1970: Connected to stream server Thu Jan 1 01:17:39 1970: Going to daemon land... Thu Jan 1 01:17:39 1970: Now playing 002.mp3 [icecast@falinux ~]$ df -h Filesystem Size Used Available Use% Mounted on /dev/root 23.2M 20.2M 1.9M 91% / /dev/mtdblock2 492.0M 57.2M 434.8M 12% /app 192.168.4.43:/nfs 455.3G 4.0G 428.1G 1% /mnt/nfs |
ps와 log메시지를 확인하여, icegenerator도 정상적으로 수행되고 있는 것을 확인 할 수 있습니다.
Winamp를 이용하여 확인 하기.
이전의 ARM PC 에서 확인 하였던것과 마찬가지로 winamp 를 이용하여 mp3 스트리밍이 정상적으로 수행되고 있는지 확인 합니다.
주소 항목에 아래의 URL을 입력합니다. 그리고 정상적으로 음악이 재생 되는지 확인 합니다.
http://192.168.10.210:8000/mp3
이상으로, ARM PC 에서 생성한 바이너리를 이용하여 G100 보드에서 동작 시키기를 수행 하였습니다.