[자강] icecast2와 MuSe 이용한 인터넷 라디오 스트리밍.

orangecrs의 이미지

icecast는 윈도우에서 지원하는 ShoutCast와 같은 오디오스트리밍 서버입니다.
릴리즈를 거듭해서 2.x의 icecast2를 선보이고 있습니다. 2.x로 넘어오면서 가장 크게 바뀐것은 Ogg/Vorbis 포맷을 지원한다는 것입니다. 그외 많은 기능이 추가 되었고 지금 설명할 2.10에서는

#Listener Authentication
#Multi-Level Fallbacks
#Burst-On-Connect

등의 새로운 기능도 추가 되었습니다. 자세한 설명은 역시나 http://icecast.org/ 를 참고하시길 바랍니다.

설치과정은 의미가 없는 것 같아 생략합니다.^^ 단 필요한 라이브러리는 알려드려야겠지요...

Ogg 포맷을 위해 필요한 라이브러리.

libogg
libvorbis
libxml2
libxslt

그리고 mp3포맷을 위한

lame (http://lame.sourceforge.net/)

이 필요합니다. 버전은 icecast의 Howto에도 별말이 없습니다. 최신버전이면 무난하게 돌아가는것 같습니다.

설치가 끝났다면 아마 prefix로 특별히 경로를 지정해주시지 않으셨다면

/usr/bin/icecast
/etc/icecast2/icecast.xml (이파일이 설정파일인데 위치가 다를수 있습니다...)
/usr/share/icecast/

icecast가 2.x로 넘어오면서 설정파일 형식이 xml로 바뀌었습니다. 그럼 설정파일을 살펴보겠습니다... 아래는 저의 설정파일입니다.

/etc/icecast2/icecast.xml

<limits> 각종 제한 설정부분 
        <clients>100</clients>   클라이언트수
        <sources>2</sources>     인코더의 채널수
        <threadpool>5</threadpool> 클라이언트의 접속수를 관리하기 위해 시작된 쓰레드수.. 
        접속자수가 빈번하거나 많다면 이숫자를 늘려주세요...  
        <queue-size>102400</queue-size> 클라이언트와 리스너의 총 큐사이즈. 만약 그 수가(이    말은 스트리밍양[byte]이라 보시면 될겁니다.) 리스너를 제외시킨다는군요... 그만큼 많은 사용자다 듣게 안해봐서 다 제외시키는지 아님 초과이후의 리스너만 제외시키는지는 모르겠군요...^^;;;  
        <client-timeout>30</client-timeout> 이거 설정값만 만들어 놓고 아직 지원이 없는것 같습니다.
        <header-timeout>15</header-timeout> 첨 접속시 걸리는 시간설정.
        <source-timeout>10</source-timeout> 소스... 즉 인코더가 아무데이터도 보내오지 않을때 접속을 끊어버리는 시간...
    </limits>

    <authentication>   인증관련
        <!-- Sources log in with username 'source' -->
        <source-password>XXXXXX</source-password> 인코더의 접근 패스워드
        <!-- Relays log in username 'relay' --> 다른 릴레이 서버를 이용할때 필요.
        <relay-password>XXXXXX</relay-password> 

        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>  관리자 아이디,패스워드. xls로 만들어진 어드민 웹페이지 접속시 필요. 디폴트를 권장하네요...
        <admin-password>XXXXXX</admin-password>
    </authentication>

    <directory> YP 디렉토리서버를 위한설정... 그런 서버도 없고 안해봐서 잘 모르겠습니다. 
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://www.oddsock.org/cgi-bin/yp-cgi</yp-url>
    </directory>

    <hostname>localhost</hostname> 호스트네임 설정 
    
    <listen-socket> 요부분은 제가 보기엔 상당히 이상한 설정입니다. Howto를 참고해도 의문을 해결할수 없더군요 port와 listen-socket의 구분이 이상해졌습니다. 버전업에 따른 변화인지...  설정자체가 묘현해 졌습니다. 요건 좀더 찾아봐야겠군요. 일단 디폴트로 설정하셔도 무방합니다.
        <port>8000</port> 
        <!-- <bind-address>127.0.0.1</bind-address> -->
    </listen-socket>
    <listen-socket> 
        <port>8001</port>
    </listen-socket>

    <relay> 릴레이 서버설정입니다. 아해봤습니다...
        <server>127.0.0.1</server>
        <port>8001</port>
        <mount>/example.ogg</mount>
        <local-mount>/different.ogg</local-mount>

        <relay-shoutcast-metadata>0</relay-shoutcast-metadata>
    </relay>
    
    <mount> 특정유저의 특정마운트(주소뒤의 식별자라라고 생각하시면됩니다.)위치를 설정할수 있습니다. 
    개인유저에게는 별다른 설정이 필요없습니다. 안해 봤습니다. 
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
        <fallback-mount>/example2.ogg</fallback-mount>
    </mount>



    <fileserve>1</fileserve> 파일연주정보를 보여줄것인가? 1: yes 0: no

    <paths>각종 경로지정... 틀리면 안돌아 갑니다... 서버실행후 경로 에러가 뜬다면 적당히 수정하세요. 
		<!-- basedir is only used if chroot is enabled -->
        <basedir>/usr/share/icecast</basedir>

        <!-- Note that if <chroot> is turned on below, these paths must both
             be relative to the new root, not the original root -->
        <logdir>/var/log/icecast</logdir> 없다면 icecast소유로 디렉을 만들어 주세요.
        <webroot>/usr/share/icecast/web</webroot>
        <adminroot>/usr/share/icecast/admin</adminroot>
        <!-- <pidfile>/usr/share/icecast/icecast.pid</pidfile> -->

        <!-- Aliases: treat requests for 'source' path as being for 'dest' path
             May be made specific to a port or bound address using the "port"
             and "bind-address" attributes.
          -->
        <!--
        <alias source="/foo" dest="/bar"/>
          -->
    </paths>

    <logging> 로그설정... 위의 디렉토리위치... 
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
      	<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
    </logging>

    <security> 보안... 
        <chroot>0</chroot> chroot 기능을 0과1로 끄고 켭니다... 그냥 놔두시고...
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
        </changeowner>
        -->
    </security>
이상이 설정파일입니다. icecast는 디폴트로 root계정에서 안돌아갑니다. 따로 계정을 적당히 만들어주셔야 합니다.

adduser -d /usr/share/icecast icecast

자그럼 서버를 돌려볼까요...

mystream icecast $ icecast -c /etc/icecast2/icecast.xml

백그라운데몬으로 돌리시려면 -b arg를 추가합니다.

에러메세지가 없다면 서버는 잘 돌아가는겁니다.

그럼 이제 소리파일을 인코딩해서 저넘의 서버로 속삭여주어야겠지요. icecast에서 언급하는 써드파티 인코딩프로그램에는

ices Unix http://www.icecast.org/ices.php
Oddcast Windows 98/NT/2000/XP http://www.oddsock.org/tools
Muse Unix http://muse.dyne.org
Darkice Unix http://darkice.sourceforge.net/
SAM2 Windows 98/NT/2000/XP http://www.spacialaudio.com
ezstream Windows 98/NT/2000/XP Unix http://www.icecast.org/ezstream.php
Nicecast Mac OSX http://www.rogueamoeba.com/nicecast/
IceGenerator Unix http://sourceforge.net/projects/icegenerator

등이 있습니다. 커맨드라인 기반이라면 역시나 ices를 추천하지만... 시대가 시대인 만큼 어찌 인터페이스를 무시하겠습니까...^^

여기서는 Muse라는 프로그램을 살펴봅니다. 윈도우의 샤우트캐스트만큼 스마트한 기분은 안들지만 그래도 그중 가장 유저의 입장에 가까이 다가온 프로그램인것 같습니다.

Muse(http://muse.dyne.org)의 설치과정 역시 생략합니다. 필요한 라이브러리는 gtk+이외에는 없어 보입니다.
설치가 끝나고 실행하시면...

번호를 보며 설명을 드리면

1. Let's stream. icecast서버에 연결버튼입니다. 클릭하시면 위그림의 오른쪽 윈도우가 나타납니다.
2. add channel. 다중 채널을 지원합니다.
3. Line in. 마이크로 입력받을수 있습니다.Line in이라고 되어있지만 실은 Mic로 입력을 받습니다.
4. Speaker. 스트림을 들을수 있습니다.
5. Vumeter. 볼륨과 전송속도를 메터로 표시하는 윈도우를 띄웁니다.
6. Undock channel.
7. 플레이목록을 결정합니다.
single play : 마우스클릭으로 선택된 한곡만 스트림하고 멈춤니다.
loop : 마우스클릭으로 선택된 한곡을 반복스트림합니다.
continuous : 목록을 차례로 스트림합니다. 목록이 끝나면 첫번째곡부터 다시 스트림합니다.

8, 9 번을 설명하기전에 바로 스트림을 해보도록 하겠습니다.
위에서 이미 icecast서버를 실행했습니다. muse에서 스트림데이터를 쏘아주어야겠지요.
1번 Let's stream 버튼을 누르면 그림의 오른쪽 윈도가 뜹니다.
스트림포맷은 두가지가 있습니다. lame을 이용한 MP3포맷 스트림이 있고 OGG스트림이 있습니다. 인터페이스는 둘다 동일합니다. MP3를 예로듭니다.

8. 인코딩 품질을 설정합니다. 눈치껏 보시면 대충설정이 가능하실겁니다. 간단히 퀄리티의 슬라이드바로 설정하시면 편합니다. 최고 해상도인 128Kbit/s 44100Hz로 설정했더니 저 같은 경우는 오히려 팝핑잡음이 나더군요. 사운드카드에 따라 적당히 설정해주시면 됩니다. I'm Expert 버튼을 누르시면 위그림에 나타난 것과 같이 수치로 입력하실 수도 있습니다. 인코딩하며 스트림되고 있는 도중이라도 여기 설정값을 변경하고 간단히 Apply버튼만 클릭해주면 인코더를 재실행 할 필요없이 바로 적용이 되는게 맘에 들더군요. 스트림을 녹음도 할수 있습니다.

9. 서버절정을 하는 부분입니다.
Host : icecast나 다른 미디어 서버가 서비스되고 있는 호스트주소.
Port : 서버가 실행하고 있는 서비스포트. Muse와 icecast는 Muse가 연결을 시도하면 랜덤포트로 통신을 합니다.
Mnt : 마운트 포인터... 쉽게 말씀드리면 방송 파일명이라 생각하시면됩니다.
Name : xmms등의 플레이어에 보여지는 제목입니다.
Url : 스트림정보에 포함됩니다.
Description : 스트림정보에 포함됩니다.
Login Type : icecast2이외에 구버전의 icecast, shoutcast 서버도 지원합니다.
Pass : 위의 설정파일에 입력한 서버로긴시의 패스워드.

설정이 끝났다면 스트림을 시작해보겠습니다. 왼쪽윈도의 목록... 마우스우클릭에서 Add File... 을 한뒤 원하는 곡을 불러옵니다. 원하는 곡을 더블클릭해 플레이를 시킵니다. Speaker버튼을 누르셨다면 인코딩되고 있는 음악이 나올겁니다.
이제 서버와 연결을 위해 오른쪽 윈도의 Connect버튼을 클릭힙니다.
연결이 제대로 되었다면 왼쪽윈도우의 밑 하단의 정보표시라인에

started streaming on http://localhost:8000/live

와 같은 메세지가 보이실겁니다. 실패시는 다른 에러메세지가 뜨겠지요.

자 이제 그럼 제대로 스트림 되고 있는지 확인해보기위해서 xmms, beep-media-player, winamp등의 플레이어로 확인해보도록합니다.

url열기를 해서 http://localhost:8000/live 와 같이 입력해봅니다. 주소는 눈치 채셨겠지만
http://+서버아이피+:설정포트+마운트포인트 입니다. 어떻게 잘 나오시나요?

지금까지 icecast와 Muse를 이용한 인터넷방송을 살펴보았습니다. 많이 부족하지만 리눅스에서 할수 있는 재미있는 스레드가 될수 있겠다 싶어 정리해봤습니다. 아쉬운것은 정리하면서 icecast.org의 Howto를 참조하는데 용어자체가 일관되지 않아 이해하기 힘든부분이 좀 있었다는것입니다. 포트 설명함에 있어 listener, client등 왔다갔다 하더군요.

그리고 Muse(0.9)에는 몇가지 버그가 있더군요. 인코딩할때 Speaker버튼이나 Line in버튼 둘중하나가 안눌러져있으면 조수미가 랩을 합니다. 플레이 속도가 두배로 빨라진다는... 그래서 제가 들을때가 아니면 Line in 버튼을 눌러두고 마이크 인풋을 Mute해 두고 인코딩합니다.
또 서버설정 윈도에서 Profile의 Save기능이 안됩니다. 재실행하면 저장해 뒀던 내용이 안보입니다. Ogg/Vorbis Streaming이 안됩니다. 이건 저만의 경우일수 있습니다. Ogg/Vorbis관련 라이브러리를 최신으로 업데이트 했지만 연결하고 인코딩했을경우 플레이어에서 보면 버퍼링하다가 다시 0%를 반복하더군요. icecast의 문제일수도 있다고 생각합니다. 버그는 아닌것 같지만 Muse에서 continuous상태에서 인코딩하면 파란색 하이라이팅이 인코딩되는 곡의 위치에 있으면 좋을텐데 이게 안되는 것과 shoutcast plugin과 같이 리스너의 숫자를 표시 못하는 것도 아쉽더군요... 좀더 관심이 있으신분은 다른 인코더인 Darkice도 사용해보시길바랍니다. 커맨드 기반이지만 Darksnow라는 gtk 프론트엔드도 있더군요.

마지막으로 개인이 집에서 DSL로 방송을 하신다면 upload대역폭의 제한으로 많은 수의 스트림을 하기에는 역부족인 경우가 있는데 이때는 sayclub을 이용하시면 됩니다. 접속하셔서 방송스트림 세션 따오셔서 Muse에서 서버Login Type를 shotcast로 설정해주시고 스트림하셔도 될것 같네요... 리눅스에서 아직 안해봤습니다.^^ wine이나 vmware로 익스 뛰우시고 들어가서 따오셔야 할것 같네요...

제가 미디어 스트림에 관심이 많습니다. 제가 가지고 있는 특별한 미디어로 만들어진 정보를 남들에게 보여주고 들려줄수 있다는게 굉장한 매력으로 다가오거든요. 다음에는 Helix Server를 이용한 동영상 스트림강좌를 정리해서 올려볼까합니다. 그럼 KIN...

ps ;;; 위키에 올리려 했는데 제가 아직 위키에는 익숙치 않네요...

Forums: 
익명 사용자의 이미지

<mountpoint>는 오그 스트리밍을 할 경우의 스트림 식별자 역할을 합니다.

<fileserve>를 키시고 루트 밑에 파일을 넣어놓으시면 사람들이 http로 파일을 받아갈 수 있습니다. 오그로 스트리밍을 하시면서 오그 플레이어 바이너리를 제공하신다거나 하실 수 있겠죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.