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 ~]$                                                                                                                         


로그인을 한 후, ARM PC의 NFS로 마운트를 합니다.

[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">

[root@falinux ~]$ cp /nfs/mp3broad/lib/libz.so.1.2.3.4   /nfs/mp3broad/lib/.  


복사된 라이브러리 파일을 링크를 만듭니다.

[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                                                                 


설정 파일과 mp3 파일을 /app 디렉토리로 복사를 합니다.

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/.                                                         

 
icecast를 실행 하기 위해서는 icecast라는 계정을 생성 해야 합니다.
이를 위하여 G100 보드에서 다음과 같이 계정을 생성하고, 로그파일을 위한 디렉토리도 생성해 줍니다.

[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                                                               


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                                                                                                                                  

ps 를 이용하여 확인 해본 결과 icecast가 수행 되고 있음을 확인 할 수 있습니다.
 
이제 icegenerator 를 실행 하도록 하겠습니다.

[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 보드에서 동작 시키기를 수행 하였습니다.