ogg 스트리밍서버 icecast2 구축하기

       ::: Vorbis OGG Streaming Server - Icecast2 :::      Powered by  dumca suh

제 목 : OGG 스트리밍 서버 Icecast2 구축하기 3편

저 자 : 서자룡
일 자 : 2003년 4월 13일 일요일, 몸이 나른나른해지는 심심한 오후
환 경 : 레드햇 리눅스 9.0, Icecast2, Ices2

1. 개 요

이번 강좌에서 리눅스상에서 오디오 스트리밍 서버로 가장 많이 사용되고 있으며, 다른 스트리밍 서버에 대해서 강력한 오디오
스트리밍을 지원해 주는 Icecast2 오디오 스트리밍 서버를 살펴 봅니다.

MP3를 지원하던 Icecast 1버전은 현재는 지원하지 않은 상태이며,그 대신 xml 형식의 설정 파일을 갖고, Vorbis Ogg 파일로 스
트리밍할 수 있게 해 주는 Icecast2 버전만 지원하고 있습니다. Icecast2에 대한 자세한 정보는 http://www.icecast.org 사이트
에서 구할 수 있습니다.

좋아요넷 음악 방송국에서는 지난번 강좌에서 다룬 Oyez 스트리밍 서버와 Icecast2 스트리밍 서버로 운영중에 있습니다. Icecast2
로 음악 방송을 하기 위해서는 몇 가지 준비물이 필요로 합니다. 또한 Icecast2는 Ices2 프로그램을 필요로 하므로 이러한 것을 설치
해야 음악 방송이 가능합니다.

이 강좌는 kerry Cox가 쓴 Icecast2 문서를 바탕으로 재구성되었고, 그동안 필자가 삽질한 경험을 토대로 강좌가 이뤄집니다.

2. IceCast란?

Icecast는 MP3와 Vorbis Ogg 포맷으로 오디오 스트리밍 서비스를 할 수 있도록 해 주는 프로그램입니다. 그러나 Icecast2에서는
MP3는 지원하지 않고, Vorbis Ogg파일만 지원하는 것 같습니다.
Icecast는 Oyez와 같이 단독으로 스트리밍 서비스를 지원하는 것은 아닙니다. 오디오 스트리밍을 서비스하기 위해서는 Icecast외
에 청취자가 서버에 접속할 수 있도록 라이브러리와 스트리밍 프로그램들이 필요로 합니다. 이러한 프로그램들은 CVS 사이트로부
터 다운로드하는 소스에는 포함되어 있습니다.

3. Icecast 설치 환경

3.1 필수 라이브러리

Icecast는 Ogg 파일에 대해서 스트리밍을 지원하는 것이므로, 이 파일 포맷으로 스트림하고 인코딩하기 위해서는 다음 패키지들이
설치 되어 있어야 합니다. 레드햇 8.0이나 레드햇9 버전에서는 다음 패키지들을 모두 지원하므로, 설치되어 있지 않다면 해당 RPM
패키지들을 설치해 주면 됩니다.

 libogg libvorbis libxml2 libxslt

3.2 Icecast 구축 프로그램

 libshout    lcecast    Ices

3.3  CVS로부터 다운로드하기

다음과 같이 Icecast CVS서버의 cvsroot 환경 변수를 지정합니다.

 export CVSROOT=:pserver:anoncvs@xiph.org:/usr/local/cvsroot

그리고 나서 cvs login 명령으로 CVS 서버에 로그인을 합니다. 이 때 암호는 anoncvs입니다.

 cvs login
 passwd : anoncvs

암호를 넣고 엔터키를 치면 아무런 반응없이 쉘 프롬프트만 나옵니다. 이 상태에서 다음과 같이 실행하여 Icecast 프로그램을
다운로드합니다.

 [root@dumca root]# cvs co libshout icecast ices

4.Icest 계정 및 디렉토리 생성

icecast는 루트가 아닌 일반 사용자 계정명으로 작동하므로, icecast 계정을 다음과 같이 생성해 줍니다.

 adduser -d /usr/local/icecast icecast

5. 소스 컴파일 ( 컴파일 순서 : libshout -> icecast -> ices )

5.1 libshout

 cd libshout
 ./autogen.sh --prefix=/usr/local/icecast
 make
 make install
 /etc/ld.so.conf 파일에 /usr/local/icecast/lib 경로 추가한 후 ldconfig 명령 실행

5.2 Icecast

 cd lcecast
 ./autogen.sh --prefix=/usr/local/icecast
 make
 make install
 mkdir /usr/local/icecast/conf
 cp conf/icescast.xml /usr/local/icecast/conf
 cp -r web/ /usr/local/icecast

5.3 Ices

 cd ices/src
 cvs -z3 co log thread net timing
 cd ../.. 
 ./autogen.sh --prefix=/usr/local/icecast
 make
 make install
 cp conf/ices* /usr/local/icecast/conf 

6. Icecast 설정

icecast2 설정 파일은 텍스트 설정 파일인 .conf 파일을 이용하지 않고, xml 파일로 구성되어 있어서, 기존 1 버전에
비해서 다소 어렵게 느껴질 수 있습니다. 그러나 몇가지 기본 설정만 이해하게 되면 스트리밍 서버를 구축하는데 어
려움없을 것입니다. 이 강좌에서는 서버 운영에 있어서 필요한 기본적인 설정에 대해서 살펴 보도록 하고 이 강좌에
서 다루지 않는 옵션 설명에 대해서는 icecast2 하우투 문서를 참고하기로 합니다.

icecast2 설정 파일은 <icecast> 태그로 시작해서 </icecast>로 끝나고, 이 태그안에는 접속제한 설정인 <limit>태
그와 인증에 관련된 태그인 <authentication> 그리고, 서버 호스트와 포트를 지정하는 <hostname>, <port>, 서버
마운트 태그 <mount>, icecast 루트 경로와 로그 경로 태그, 로그 파일 그리고, chroot 설정 태그등 주요 설정 태그
들이 위치합니다.

각 태그의 설명은 icecast 예제 파일에 설명해 놓았고, 다음 박스에서는 필자가 운영중인 icecast2 서버의 실제 예제
를 첨부하였으므로, 참고하면 됩니다.

<icecast>
 <location>Not Currently Used</location>
 <admin>Not Currently Userd</admin>

  <limits>
  <clients>100</client>
  <sources>2</sources>
  <threadpool>5</threadpool>
  <client-timeout>30</client-timeout>
  <header-timeout>15</header-timeout>
  <source-timeout>10</source-timeout>
  </limits>

   * Limit 접속 제한 설정 *
   icecast 서버에 접속할 수 있는 클라이언트 수(clients)와 icecast 서버에 스트림을 제공
   할 소스 클라이언트<sources>의 갯수를 지정해 줍니다. 여기서 <sources>는 나중에
   살펴볼 stream source 프로그램인 ices2과 같은 소스를 몇 개나 받아 들일 것인가를 설
   정해 주는 옵션입니다. 단지 한 개의 오디오 스트리밍을 하고자 한다면 <sources>값은
   1로 설정해 주나, 2개의 ices를 서비스하고자 한다면 2로 설정해 주면 됩니다.
   <threadpool>옵션은 몇 개의 자식 프로세스가 분기되도록 설정할 것인가를 설정합니다.
   < client-timeout>은 xmms와 같은 클라이언트가 끊어진 후  타임아웃시킬 시간으로  단위     는 초입니다. <source-timout>은 ices2등과 같은 클라이언트가 종료된 후  타임이웃될     시간입니다.


   <authentication>
         <source-password>hackme</source-password>
         <relay-password>hackme</source-password>
         <admin-user>admin</admin-user>
         <admin-password>hackme</admin-password>
   </authentication>

   * authentication 인증 설정 *
   <source-password>는 ices와 같은 스트리밍 소스 클라이언트에서 사용할 패스워드로
    ices의 인증에서도 동일한 암호를 사용해야 하는 것 같습니다.
   <relay-password>는 icecast 서버(중앙 방송국)를 중계하고자 하는 하위 서버(지방
    방송)에서 접근할 때 필요로 하는 인증 암호입니다.
    <admin-user>와 <admin-password>는 관리 웹페이지를 접근할 때의 아이디와 비번
    을 설정합니다.

   <directory>
   <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
   </drectory>

   * directory 디렉토리 설정 *
   공개 icecast 디렉토리 서버의 URL를 지정해 주는 것이라고 하는데, 정확한 의미는 모
   르겠군요. 저는 아예 이 옵션을 제외하고 있습니다.

   <hostname>localhost</hostname>
   <port>8000</port>
   <relay>
     <server>127.0.0.1</server>
     <port>8001</port>
     <mount>/foo.ogg</mount>
     <local-mount>/bar.ogg</local-mount>

    *icecast 서버 정보 설정 *
    <hostname>은 icecast 서버의 호스트 이름이나 아이피 주소를 설정합니다. 일반적
    으로 localhost로 설정하지만, 실제 서버의 주소나 호스트 이름을 넣어 줍니다.
    icecast는 기본적으로 8000번 포트를 사용합니다. 다른 포트값을 사용하여도 되지만,
    특별한 경우가 아니라면 기본 포트를 사용합니다.
   <relay>는 중계 서버를 운영할 때 필요하므로, 이 경우에는 해당한다면 메뉴얼을 참
   고하기로 하며, 여기서는 생략합니다.

   <mount>
     <mount-name>/example1.ogg</mount-name>
     <username>othersource</username>
     <password>hackmore</password>
     <max-listener>1</max-listener>
     <dump-file>/tmp/dump-example1.ogg</dump-file>
     <fallback-mount>/example2.ogg</fallback-mount>
   </mount>

   * mount 마운트 정보 *
   <mount>는 정확히 무엇을 의미하는지 하우투 문서를 보아도 이해가 되질 않는군요.
    운영해 보면 mount로 지정되는 이름은 winamp나 xmms와 같은 클라이언트 프로
    그램에서 icecast 서버를 마운트해서(여기서 마운트 개념은 자동으로 icecast를 찾
    아 스트리밍이 자동 실행되도록 하는 것이라 판단됨) 스트리밍이 가능하도록 할 때
    의 플레이리스트 파일명을 말하는 것 같습니다. 즉 /example1.ogg는 클라이언트
    프로그램에서
http://joayo.net/example1.ogg를 지정해 주어야 방송을 듣게 됩니다.
  
   <fileserve>1</fileserve>

    * fileserve 연주 파일 출력 여부 *
    웹상에서 연주되는 파일이 보여지도록 하려면 이 값을 1로 설정합니다. 이것은 아래
    에서 살펴 보게 될 <webroot>태그에서 지정된 웹 루트 경로에 있는 xml 파일이 웹
    상에서 보여질 때 연주 곡목이 보여지게 됩니다.


    <paths>
     <basedir>/usr/local/icecast</basedir>
     <logdir>/usr/local/icecast/logs</logdir>
     <webroot>/usr/local/icecast/web</webroot>

     * paths 경로 설정 *
     <basedir>은 icecast가 설치되어 있는 경로를 기본 경로로 삼습니다.
     <logdir>은 icecast의 access와 error 로그가 저장될 디렉토리를 지정합니다.
     <webroot>은 icecast 상태를 볼 수 있는 xml 파일이 있는 디렉토리를 지정합니다.
     상기 설정 태그중에  fileserve 태그의 값을 1로 설정해야 스트리밍되는 파일들이
     웹 문서상에서 보여지게 됩니다.

    
   <logging>
     <accesslog>access.log</accesslog>
     <errorlog>error.log</errorlog>
     <loglevel>4</loglevel>

     * loggin 로그 파일 지정 *
     icecast 서버의 접속 메시지와  오류 메시지를 저장할 파일을 지정합니다.


   <security>
     <chroot>0</chroot>
     <user>nobody</user>
     <group>nobody</group>
   </security>
 
    * security 보안 설정 *
    chroot를 설정하면 기본 경로에 대해서 루트 경로로 사용할 수 있습니다. 그리고
    icecast는 일반 계정으로 작동하므로, icecast 계정으로 데몬이 작동해야 합니다.

<icecast>

* 필자 설정 파일

<icecast>
<limits>
  <clients>20</client>
  <sources>2</sources>
  <threadpool>5</threadpool>
  <queue-size>102400</queue-size>
  <client-timeout>30</client-timeout>
  <header-timeout>15</header-timeout>
  <source-timeout>10</source-timeout>
</limits>
<authentication>
         <source-password>kkolddugi</source-password>
         <relay-password>kkolddugi</source-password>
         <admin-user>admin</admin-user>
         <admin-password>kkolddugi</admin-password>
</authentication>
<hostname>localhost</hostname>
<port>8000</port>

<fileserve>1</fileserve>
<paths>
     <basedir>/usr/local/icecast</basedir>
     <logdir>/usr/local/icecast/logs</logdir>
     <webroot>/usr/local/icecast/web</webroot>
<logging>
     <accesslog>access.log</accesslog>
     <errorlog>error.log</errorlog>
     <loglevel>4</loglevel>
<security>
     <chroot>0</chroot>
     <changeowner>
        <user>icecast</user>
        <group>icecast</group>
     </changeowner>
</security>
</icecast

7. icecast2 실행하기

icecast2 설정이 완료되었다면 다음과 같이 실행하여 icecast 데몬을 백그라운드 모드로 띄웁니다.

 [root@dumca bin]# ./icecast -c /usr/local/icecast/conf/icecast.xml &
  Changed groupid to 647.
  Changed userid to 647.
 [root@dumca bin]#

8.ices2 설정

ices2 설정 역시 icecast2와 마찬가지로 xml 형식으로 구성되어 있습니다. ices는 icecast에 ogg 포맷으로 스트리밍 소스
를 제공해 주는 소스 클라이언트 프로그램입니다. 오디오 스트리밍은 이 프로그램이 ogg 파일을 연주하여 icecast에 전달
해 주고, icecast는 청취자 프로그램에게 스트리밍을 전달해 주는 역할을 합니다.

ices2 설정은 icecast와 유사하므로 기본적인 몇가지 설정만 이해하면 쉽게 서버를 구축할 수 있습니다.


 <?xml version="1.0"?>
 <ices>
   <background>0</background>
   <logpath>/usr/local/icecast/logs</logpath>
   <logfile>ices.log</logfile>
   <loglevel>4</loglevel>
   <consolelog>0</consolelog>

   * Global configuration 전체 설정 *
   <background>는 ices 데몬을 백그라운드로 실행할 것인가를 설정하는 것이지만,
   ices 데몬은 백그라운드 모드로 작동시켜야 하므로, 별 의미가 없는 설정으로 생각
   됩니다.
   <consolelog>는 로그 메시지를 파일로 저장할 것인가 아니면 화면으로 출력할 것
   인가를 설정합니다. 0은 파일로 저장, 1은 화면으로 출력되도록 하는 것입니다.

   <stream>
         <metadata>
              <name>Radio Free Linux</name>
              <genre>Playlist</genre>
              <description>Jazz Music</description>
         </metadata>

   * metadata 서버 메타 정보 설정 *
    서버의 이름과 음악 방송 장르 그리고 간단한 서버 설명을 설정해 줍니다. 여기서
    설정된 값들은 클라이언트(winamp.xmms)에서 보여집니다.
 
         <input>
              <module>playlist</module>
              <param name="type">basic</param>
              <param name="file">playlist.txt</param>
              <param name="random">0</param>
              <param name="once">0</param>
         </input>

    * input 스트림 소스 형태 설정 *
    ices는 3가지 정도의 모듈을 지원하는데, 하나는 oss 모듈이고 다른 하나는 playlist
    그리고 마지막으로는 STDIN 모듈이 있습니다. 실제로는 oss와 playlist 두 모듈이 많
    이 사용됩니다. 모듈에 따라서 param 태그의 설정값들은 다르므로, 이들에 대해서는
    하우투 문서를 참고해야 합니다.
    oss 모듈은 커널에서 OSS 형태로 지원하는 사운드 카드로 생방송을 하고자 할 때
    사용하는 모듈입니다. 방송자가 직접 마이크를 이용하여 생방송을 하고자 할 때는
    사운드 카드가 OSS 모듈을 이용해야만, 이 모듈로 생방송을 진행할 수 있습니다.
    via칩 사운드 카드는 OSS 모듈이 아니기 때문에 대부분의 마더보드에 내장된 사운드
    카드로는 이 모듈을 사용할 수 없습니다.
    playlist는 ogg 파일을 이용하여 스트리밍하고자 하는 형태에서 사용하는 모듈입니다.
    여러분이 ogg 파일로 오디오 스트리밍을 하고자 한다면 이 모듈로 설정해야 합니다.
    type에는 basic과 scripts가 있지만, 스크립트를 사용하는 경우가 아니라면 basic으
    로 설정합니다. file은 연주될 ogg 파일 목록을 말합니다. 이 파일을 만드는 방법은 다
    음과 같은 식으로 만들면 됩니다.
    find /경로명 *.ogg -print > playlist.txt
    playlist.txt  파일은 반드시 ices 데몬을 실행하고자 하는 현재의 작업 위치에 이 파일
    이 존재합니다. 즉 /usr/local/icecast 디렉토리에서 ices 데몬을 띄우면 이 디렉토리
    내에 playlist.txt 파일이 있어야 합니다.
    random은 playlist.txt 파일안에 있는 곡들을 무작위로 실행되도록 할 것인가를 설정
    합니다. 0은 순서대로, 1은 무작위 순서입니다.
    once는 playlist.txt에 있는 파일 연주가 단 한번으로 끝날 것인가 아니면 로테이션될
    것인가를 선택합니다. 0은 반복, 1은 1회 연주입니다.

         <instance>
              <hostname>64.147.xxx.xxx</hostname>
              <port>8000</port>
              <password>xxxxxx</password>
              <mount>/radiofree.org</mount>
              <reconnectdelay>2</recoonectdelay>
              <reconnectattempts>5</reconnectattempts>
              <maxqueuelength>80<maxqueulength>

   * instance 서버 접속 설정 *
   hostname은 ices의 서버 주소를 지정합니다.
   port는 ices 서버가 접속할 주소입니다. icecast 포트와 동일하게 설정합니다.
   mount는 xmms,winamp에서 작동으로 실행되도록 할 마운트명칭입니다. 서버 주소가
   joayo.net이고, 마운트명이 /joayo.ogg이면 클라이언트 프로그램에서 자동 실행될 서
   버 주소는
http://joayo.net:8000/joayo.ogg입니다. 웹 브라우저에서는 http://joayo.net:
   8000/joayo.ogg.m3u입니다. 만일 이 옵션이 생략되면 /stream.ogg의 마운트명을 사용
   하게 됩니다. 참고로 마운트명앞에 슬래쉬를 사용해야 합니다.


           <encode>
              <nominal-bitrate>32000</nominal-bitrate>
              <samplerate>22050</samplerate>
              <channels>2</channels>
          </encode>

   * encode 인코딩 설정 *
   sampletate는 인코딩하고자 하는 bitrate를 설정합니다. 일반적으로 44100으로 설정합
   니다.
   channels는 인코딩하는데 있어서 채널 수를 설정하는데, 반복 샘플링과 다운믹싱이
   동시에 이뤄지므로, 이 채널 수는 2로 설정해 주어야 합니다. 만일 1로 설정해 줄 경우
   downmixing만 이뤄지게 되고, 이것은 사운드가 스테레오에서 모노로 방송되게 됩니다.
   스트레오 방송을 위해서는 2로 설정합니다.


            </instance>
    </stream>
 </ices>

     * 필자의 ices 설정 파일

 <?xml version="1.0"?>
 <ices>
   <background>0</background>
   <logpath>/usr/local/icecast/logs</logpath>
   <logfile>ices.log</logfile>
   <loglevel>4</loglevel>
   <consolelog>0</consolelog>
 
   <stream>
         <metadata>
              <name>Joayo.net Music Broadcasting System</name>
              <genre>The Classic</genre>
              <description>Just Classic Music Stream</description>
         </metadata>
    
         <input>
              <module>playlist</module>
              <param name="type">basic</param>
              <param name="file">playlist.txt</param>
              <param name="random">0</param>
              <param name="once">0</param>
         </input>

         <instance>
              <hostname>joayo.net</hostname>
              <port>8000</port>
              <password>kkolddugi</password>
              <mount>/joayo.org</mount>
              <reconnectdelay>2</recoonectdelay>
              <reconnectattempts>5</reconnectattempts>
              <maxqueuelength>80<maxqueulength>
          <encode>
              <quality>5</quality>
              <nominal-bitrate>64000</nominal-bitrate>
              <samplerate>44100</samplerate>
              <channels>2</channels>
          </encode>
          </instance>
    </stream>
 </ices>

   9. ices2 실행

 [root@dumca bin]# ./ices /usr/local/icecast/conf/ices.xml &
 [root@dumca bin]#

  10. icecast 스트리밍 서버 접속

   웹 브라우저에서 먼저 http://icecast서버주소:8000/status.xsl를 입력하여 접속합니다. 그러면 icecast2 status라는
   제목으로 웹페이지가 열리고, 현재 방송중인 마운트명이 보이게 됩니다. 정상적으로 작동한다면 Listen 항목에서 here
   라는 링크가 보여야 정상입니다. here를 클릭하게 되면 자동으로 winamp나 xmms가 작동하여 스트리밍을 들을 수 있
   습니다.

   리눅스의 xmms에서 스트리밍을 들으려면 URL 주소에 "http://icecast서버주소:8000/마운트명"을 넣어 주고 플레이
   버튼을 눌렀을 때 버퍼링이 이뤄지면 정상입니다. 윈도우의 경우 winamp3는 제대로 작동하지 않으며, winamp1에서
   리눅스의 xmms와 같은 식으로 주소를 지정해 주면 정상적으로 작동합니다.

   필자가 운영하는 icecast 서버 주소는 http://joayo.net:8000:/joayo.ogg입니다. winamp나 xmms에서 이 주소를 지정
   해서 방송을 들을 수 있는지 확인해 보시기 바랍니다. 필자가 좋아하는 성향의 음악이 흘러 나올 것입니다.

   필자의 다른 icecast 서버 주소는 http://muse.joayo.net/joayo1.ogg입니다. 생방송 icecast 서버 주소는
   http://muse.joayo.net/joayo2.ogg입니다. 운이 좋으면 제가 테스트하고 있을 때 별로 좋지 않은 저의 음성을
   들을 수 있는 기회가 있을지도 모릅니다. joayo2.ogg는 음성 스트리밍을 위한 것입니다.

  11. MP3를 Ogg로 변환하기

   mp3를 ogg 파일로 변환해 주는 유틸리티는 다음 사이트에서 구할 수 있습니다.

   oggasm     http://oggasm.sourceforge.net
   mp32ogg 변환 스크립트 리눅스피아 자료실
   

   12. wav를 ogg 파일로 만들기

   oggenc를 이용하여 원하는 quality(-q 옵션)를 지정하여 wav 파일을 ogg 파일로 변환할 수 있습니다.
   사용법은 oggenc -q 10 wav파일명입니다. 퀄리티가 10이면 아주 좋은 음질 상태로 변환해 주나, 파일 크기는 엄청
   커집니다. 보통 128K 수준으로 하려면 5 정도면 될 것 같습니다.

  <참고> 이 강좌는 낙동강 오리알 처럼 미완성의 강좌가 되어 버렸습니다. 쓰는 동안 귀찮음이 발동하고, 일부 설정들에 대한
  이해 부족으로 인하여 후반부 설명이 다소 미진한 점이 있습니다. 또한 생방송을 위한 설정 예제를 설명하지 않는 점이 미완의
  강좌가 되었고, 플레이리스트 모듈에 생방송 모듈을 추가하여 라디오 방송과 같이 방송하는 방법을 아직 터득하지 못한 관계로
  이번의 강좌는 형편없게 되어 버렸습니다. 이러한 저의 부족함을 보완해 줄 수 있는 분은 게시판을 통하여 한 수 지도를 부탁드
  리겠습니다. icecast에 대한 이해가 충분해질 때 완벽한 강좌로 찾아 뵙겠습니다.

 

OGG Streaming Server - Icecast2

 

 




'리눅스' 카테고리의 다른 글

리눅스 영한사전 (gtk)  (2) 2006.10.18
[ubuntu] 패키지 설정까지 한번에 지우기  (0) 2006.10.13
[ubuntu] MPD- Music Player Daemon  (0) 2006.10.11
한영키 설정하기  (0) 2006.09.15
[VIM] 지역변수 찾아가기 - gd  (0) 2006.09.13