Episode: 1207
Title: HPR1207: Icecast 101
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1207/hpr1207.mp3
Transcribed: 2025-10-17 21:37:18

---

This is Hacker Public Radio.
Hi everyone this is Glad to and this is Hacker Public Radio and I'm going to talk about
ice cast and ices and butt and MPD and a bunch of other things.
This is really a collaborative episode.
I'm just taking all the glory and fame for myself contributing to this episode and not
being heard on this episode were K-Wisher from K-Wisher.com I don't know I just made
that up and Delwin from skyhaven.net or org or something and a bunch of other people
who helped me finally finally understand all of this.
So what is all of this?
Well all of this consists of the very concept of streaming media online.
It's done everywhere.
We use streaming media all the time.
You can think about it, YouTube, Netflix, that's all I can think of but there's a lot
of them out there.
Oh, Jim Mendo, internet radio stations, all the things that all the multimedia content
online or a lot of it is available as a streaming in a streaming form and that's really great
and it's a lot of fun and makes the internet a much more loud place.
But how does it work?
Well if you don't know if you're not I did not know either for the longest time people
would ask me about streaming.
I really had no clue what they were talking about.
I mean I knew the concept but I certainly didn't know how it all worked.
And frankly I still don't have a good notion of what exactly it is that a web browser
or whatever is latching on to when you're saying okay give me this media and just keep
it coming.
Just keep getting the media as it streams to you.
I always want my web browser or my whatever I'm using to grab media from a network location.
I want to think that there's this self-contained finite file, you know some number of bytes that
is predictable and I should be able to grab onto that and transfer all of those bytes
and bits and then close the connection and that's it, that's how it works right.
So how is it that you can open a web browser or a media player or whatever to a location
on a server that doesn't have a finite amount of bits or bytes?
How does that work?
Well I don't really know the low level of that stuff.
I don't know what the variables involved are when you're doing that as opposed to just
grabbing a file with some finite predetermined size can't tell you.
But we're not going to be concerned about sort of the technical background and what's
going on behind the scenes, we're going to be concerned about the technical background
and what's going on behind the scenes on the server.
So client side I don't care about right now, we're going to talk really mostly about
the server and how you as a server admin can set up a streaming server, get your content
onto the server and then stream it out so that people can tap into it and listen.
And that's similar, that example that's similarly I guess whatever is very apropos because
tapping into a stream you think of maybe putting a tap on a keg of I don't know coffee
or something or putting a faucet on a pipeline and so it's streaming this sort of continuous
flow of information or water or maple syrup or whatever you're tapping into and then
the faucet that you're using lets you get that content even as it continues on by.
So I'm going to use that a couple of times because at least in my mind it helps understand
the structure of some of the applications that are playing very important roles on the
back end.
So the thing that will take center stage right now for streaming media on a Linux server
is something called icecast.
So icecast is a it's a streaming server.
Its job is to create a mount point on a server that clients can then connect to and get
whatever is streaming.
Now what's interesting is that you can start up icecast and you can run it you can have
it all configured and start that service and it can be streaming nothing really it can
it can be sort of if you could imagine a a pipeline without anything in it but there's
the conduit right so you've got like this this empty stream that's important to understand
because icecast is kind of an independent piece of this whole puzzle.
So the process the workflow here is to set up icecast that creates the conduit for
your stream and then to plug in different components like ISIS or MPD or but or whatever
and feed that conduit with actual data that people that people could listen to.
Okay so lets install icecast then obviously the installation is going to depend on what
distribution you're running on your server so if you're running slackware you could
install it via slackbuilds.org go there or use my sport tool sport install icecast will
install icecast.
Now for the record it's actually icecast two that's important not that probably there
are that many icecast version one packages floating around out there but just know that
actually it is icecast two and some distributions might specify it as icecast two in fact I think
Debian does I think if you go to Debian and install it with aptitude install or whatever
you use I think it's as icecast two that it lists I don't remember if they actually
have one offered or what but the name of the package is icecast two anyway however you
get there young install icecast emerge icecast I don't know all the different ways you could
possibly do it install icecast it's not hard on any Linux or BSD distribution so you do
that you install it and now you're left with as is often the case the executable binary
itself which in this case will probably be in slash usr slash bin icecast or slash usr
slash bin slash icecast two and then you'll have a bunch of or at least one possibly two
configuration files I say at least one and possibly two because again on Debian where
they do that whole thing of dumping some of your config files in slash atc slash default
and then the other ones in slash atc slash icecast two you'll have you might have more than
one configuration file depending on what system you're running so there are a couple
of things that you need to do certainly to get this thing up and running out of the box
as it is installed right now if you typed in icecast two or icecast or whatever it would
fail to launch because there's an enable flag in the configuration file now in the Debian
version it is in slash atc slash default slash icecast two and you need to go into that
file specifically and look at the bottom of the file there's an enable equals false
you need to set that to true if you don't set that to true then when you attempt to start
the init script for icecast it will fail in other distributions this file will be found
in the icecast folder itself in slash atc slash icecast or icecast two whatever slash icecast
dot conf so just look around for that you should be able to find it pretty easily it's a small
file and really the only thing you need to change you absolutely need to change is the enable
flag there's some other options in there I think for logging and stuff like that but but enable
should be set to true so do that first so that the next thing that you can do is look at slash
atc slash icecast or icecast two slash icecast dot XML that's important because without this configuration
file you'll be running a very very very stock configuration of icecast and that's not necessarily
the most secure or really what you want to do okay so the icecast dot XML is a little bit more
complex looking than it actually is it gives you a lot of examples a lot of things that you could
turn on to make a maybe a fancier server than what we really need to do just to get this thing
up and running so we probably won't do that but a couple of the things to pay attention to it would
be right up at the top of this file there are limits that you can set so you can limit how many
connections or clients can actually connect to your icecast server k-wisher had us test his
streaming server and I think he was getting a hundred clients easily I don't remember how much
ram he said he had on his box but he wasn't having any issues with a hundred clients I've
not reached a hundred yet myself I don't believe and I've got eight gigs of ram it's like a I don't
know a dual core AMD of some amount of powerful gigahertz so I don't know it's I'd play around
with that I I leave I left it at the default value for now sources I'm limiting it to two because
I only want there to be two sources for this icecast stream both of which exist on this same box
so I decided to limit it to just two because that's really all I'll ever need right now so you can
set that and other limits as well depending on what your needs are so the next thing is the
authentication and as you might expect yeah authentication is kind of important so the this
authentication not for you to sort of log into anything it's authentication for your sources
and relay as if you're going to do any relay which were not in this episode but but certainly
you're going to have a source you're gonna have some kind of thing that wants to talk to icecast
remember because that's what we were saying one of the things about icecast is that it lays down
this conduit and then you use little plugins or I guess we could call them sources to feed that
icecast stream with different kinds of data whether it's an org file or an MP3 file or a microphone
or whatever those are all sources and they need to be able to authenticate with icecast or else
you could have totally random things being inserted into your stream without your knowledge
and that could be a bad thing so the source password you need to set I think by default it's
set to something like hack me and you should change it so we'll change that to let's just say
I don't know purple llamas so we just set that to purple llamas and now that's our password
that we need to remember because when we start plugging sources into our icecast it's kind of
kind of want to know that password you can do the same thing with your relay password if you're
going to do relays I'm not going to do relays in this episode you can also have an admin login
which is something that we'll be able to actually sort of actually be used because there are some
nice friendly icecasty interfaces that you could take advantage of once you get all this setup
so the admin user you should give that person a name I'm going to call it not class 2
and then the password for that I'm going to set to purple llamas as well I know that's probably
really bad practice but it's just easier for us to keep track of all that stuff right now I think
the host name you can actually leave as local host the next thing that you'll probably notice is
the host name value and that is set by default to local host I actually keep it at
local host myself because I'm not I'm not publishing a URL via icecast so it doesn't really matter
what what icecast thinks its host name is it doesn't that's not going to be seen by anyone
if you know that there are different ways to configure this obviously and this this is the
way that I'm configuring it if you want to look into other ways you can we'll just keep it like
this for now the listen socket is port 8000 by default and we'll keep it there because why not
and um that's about all you really need there's further down the I mean you'll see a lot of
commented out stuff probably and a lot of this is like I say it's just kind of examples of
fancier setups that you could investigate later but for now I think all of the all of the defaults
are pretty good so everything else basically you can just leave as is that's enough to get us
to get us going so now you're configured you're configured with with the XML file and you're
configured with your conf file you've enabled it in the conf file and you've set some some
non default values for passwords and usernames in the XML file and other than that that's all
you really need to do so now what you can do is launch icecast and the way that you're going to do
that again naturally depends on your system on the on the distribution so if it's slackware
it would be in slash at c slash rc dot d slash rc dot icecast if you're on devian it would be
slash at c slash in it dot d slash icecast two and on fedora these days system control or system
ctl start icecast dot service or whatever it is so now it started and as I've said now your conduit
exists you've got a you've got a pipeline in place only there's nothing there so in theory if
you were to go to a client machine and point your web browser to ht or your media player to http
colon slash slash migrate streaming server dot com colon 8000 then you've got an empty stream now
actually anything that would normally play a stream for you would detect that there is no place
to obtain a stream and fail out or time out or something like that and so that would be useless
but but conceptually that is there and and and you can still kind of see what's going on with
icecast by simply pointing a web browser to a htp colon slash slash migrate streaming server
dot com colon 8000 slash status dot x s l that will show you any kind of pertinent data on your
icecast streaming server such as any available mount points of which right now there are none
how many people are connected to your your streaming service which right now would be zero
and and how long it's been online and things like that so that exists it's part of the icecast
distribution I forget where they stash that it might be some place in like slash usr slash
share slash icecast something like that but but that xsl is there it gives you a little bit of
updates and and status reports on what exactly is going on with your streaming server which is kind
of fun to look at sometimes and it kind of confirms that hey yes icecast is working it's up and
running it's ready to accept a source so let's get something streaming then let's get a source
going so that our icecast conduit can actually have data in it so that people can connect and
hear stuff so that's not that hard and there are a lot of different options in this episode I'm
going to give us the kind of the defaults I want to say native although I don't really know if
that's the right word but it it's kind of the one that that goes along really nicely and was built
I think for icecast specifically if I recall correctly so it's called ises ises there are two
versions of it there's ises the one that exists now and then there's ises the old one what's the
difference ises the one that exists now has auga streaming capability we like aug auga is good
auga is great for firefox chrome chromium conqueror opera reconk xmms audacious vlc rhythm box
just everything everything you can think of that you know and love auga vormis is a fine streaming
format and then there's everyone else with their safaris and their internet explorers and their
iTunes and none of those of course will play nicely with auga great so that means we're going to
have to have two streams here the easiest way to do well the easiest way for me to do that was to
use the old version of ises call which I don't know what it's called I think it's just called the old
version but but it was it was named for the slack build dot org people ises dash cc I don't know
what the dash cc was supposed to stand for I really don't but it's the old version of ises 0.4
0.3 very specifically this is the old version of ises and the significant thing about that is
that it it can handle mp3 streaming so if you've got the old version of ises handy in a buildable
way and it might not be I've tried to build it from scratch on a debian box and it wasn't really
playing that nicely with a bunch of components and I eventually just kind of gave up on it because I
lost interest and I found a different solution which I will share with you later but right now we're
going to go with ises so if you want to do this for real in real life you want to have two streams
because otherwise everyone will have to use firefox or chrome or chromium or opera or whatever you
can offer your listeners or vlc to to do org streaming correctly and and in real life for like
maximum audience that's a little bit dicey that's a little bit tough I mean I've I've heard back
from I used to only be doing an org stream and I heard back from a lot of people like a surprising
number of people I was honestly surprised how how they couldn't get the thing to to work
and the reason was was that they were using I guess a non firefoxian browser I'm guessing I
I don't really remember exactly but they couldn't figure out I mean like they would click on the
thing and it would want to open in some external media player like iTunes or whatever and it just
wouldn't play and emailing people back 20 times a day saying okay you need to either install
this component for your quick times or your or you need to install this browser or you need to
click on it in this way that that's not realistic so you're going to probably end up having two
streams sorry so I says the current version will only stream org I says the old version will
stream both mp3 and org but may not be readily available for your platform either way we're
going to go with ices for now because it's got a simple XML based configuration file that talks
really easily and quickly to icecast but then we're going to in a later episode we will look at a
different solution that can give you the same effect in a different way and there's there's some
really nice features of these other solutions as well so I'm not saying that ices is necessarily
the best solution I'm saying for now just to get this thing finished within this episode this is
going to be the easy solution so for now resign yourself to an org only stream if you only have
the new version of ices or switch to slackware you know you want to anyway and install ices-cc that's
the 0.4.3 version and then you'll have the capability of having both an mp3 and a log stream
okay so we're going to keep it simple we're installing ices and you open up the ices configuration
file which again it's obviously going to depend on where your distribution places it for me it
was just in slash etsy slash ices-cc.conf.new actually so you could rename it to just ices-cc.conf
and then take a look at it in your text editor at emax nano vim whatever so right up at the top
of this font file there's a file value that you need to set by default is called playlist.txt
and frankly that's good enough I mean that's that's what I do but you could name it something
else if you want the the important thing to know here is that's the playlist that's your master
playlist that you will populate with all the names of all the songs that you want to play on your
stream and ices will look to that file so you want to kind of either remember the name of this
thing or set it to something that you will remember but playlist.txt seems pretty logical to me
there's a randomized option which is set by default to one I set it to zero myself zero means
it'll play through in the order that you specified one meaning that it will randomize your playlist
and there's a couple of different things that you can use to handle all of this you know to parse
the playlist and stuff like that there's the built-in engine or or module there's pearl and there's
Python I just left it on built-in I'm not sure if there are any particular advantages to switching
it to something else but from what I understand if you're using fancy scripts that are interacting
with ices then yeah you might want to change it to something else so that you can kind of tap into
different I guess APIs and stuff like that I set the execution to one to make it run as a
background process you may want to leave it at zero for now however so that you can see kind of a
a verbose debugging message when you launch ices just to make sure that you're getting everything right
but in real life after I've got everything set up I set it to one so that it does launch essentially
as a demon the next value you'll want to set is probably the log the log folder where the
logs are going to get dumped in when you're demonizing ices by default it's set to slash temp
and it explicitly says in a comment don't use slash temp not really sure the logic there but
that's cool so change it to something that you feel more comfortable with and of course that the
the the user running ices is going to have access to so that it can actually write the log file
otherwise ices will not launch properly so what you might want to do is leave it as slash temp
for your first go-around just because obviously it's going to be able to write log files to slash temp
and once you see that it's working and up and running then choose where you're going to write your
log files to it's probably going to be somewhere in var slash var slash log and and then make that
happen and give it the correct permissions so maybe start with temp that's probably the logic
start with temp just to for debugging purposes or testing purposes and then change it later that's
what I did the the next thing that you're going to have to set just going continue down this
configuration file is the streaming server that server that ices wants to connect to because I
remember I said that icecast is a conduit so we have to point ices to that conduit we have to tap
into that conduit and this is where we're doing that so the host name we can leave as local host
because it is and if you'll recall the icecast server when we were setting the icecast XML up
we left that as local host so local host local host very consistent the port
of that host that that icecast or the streaming server is existing on that's set to 8000 by default
and sure enough that's what we left it as and then of course the password and do you remember the
password yes the password was purple llamas don't tell anybody so we'll set that to purple llamas
and the protocol of course is HTTP I don't know really a whole lot about changing that from HTTP
although for older versions of icecast I guess there was a different protocol but of course I
just left it on HTTP next is the mount point so you've got icecast kind of creating this pipeline
out to the world but there's not really anything to latch on to there's no data there right so
we need to create a data point a mount point for for the browsers and the media players to latch
on to and get the data in that stream by default it's slash ises I don't leave it as that
because that's just a weird name for a mount point when you're you know migrate streaming server
comms a colon 8000 slash ises it's weird you could call it slash mp3 you know you can call
whatever you want to really something that makes sense you can also of course alias it you know
so that if if you're listening on port 8000 and someone goes to 8000 then you could just make
sure that they end up at that mount point you can do all kinds of fancy things but just set it
to something logical right now for this one ises dash cc I'll call this one slash mp3 and then
later I'll fire up just ises and call that slash aug and then you can do different metadata types
of things like the name of the stream by default it's set to quote default stream not very interesting
so you might want to call it you know my cool internet radio station the genre you could give it
the genre the description the url that you want to point people to if they ever stumble across
your your streaming server they want to know like who you are where they can go get information
more information and then very importantly you need to set the bitrate 128 is the default I have
personally found that's a little bit high for the the kind of bandwidth that I have access to I
think I set it to 96 and was pretty happy with it I think I've even set it lower and have been
complacent you can re encode it one for mono or two for stereo or just leave it to zero for
it to not re encode you can set a different sample rate and how many channels you want and that's
it that's the end of that configuration file if you have set all those values then you're pretty
much ready to go with your ises streaming source the problem now is that you have no playlist so
ises you could start it it would run but it doesn't see any music for it to play so you need to
create a playlist you can put the playlist anywhere I put it in user local share I put it in the
main users home folder I've played around with where it's going to go a couple of times you can
put it wherever just make sure that that it's in a place that ises the user running ises
would be able to access you know you don't want to put it into your home folder if you've got
700 permission set on your home folder right so make sure that it's something that other users can
read and the playlist is very simple it's a line one song per per line list of all the
songs of all the files you want ises to play you're going to want to make sure that you have
full paths set in all of your all of the song titles so make sure you go from the root directory
into the next directory into your into your songs or wherever they exist if they're in
slash home slash clatu slash albums slash pneumatic dark side of the moon slash track 1.org then
make sure that you're giving it that whole path so that ises can find the songs you have to
remember that ises isn't going to be run as clatu it's it's its own process it's going to be run
is whatever the the maintainers of that package have set it to for you on your system and so it
needs to have access and it needs to know where to look for all the different music that you've got
on your system that you want to be streaming now we need to start it because obviously it's
installed and it's configured we just have not actually yet started the process there is an
rc dot ises dash cc that was bundled along with the ises dash cc package that I got from slackbuilds.org
I don't know where it comes from I don't know exactly who I mean I know who wrote it but I don't
know really who they're affiliated with or anything like that you could adapt it for whatever
distribution you're you're running or you can simply start it manually or or roll your own the
the command to be most aware of the the basic command is ises where ises dash cc dash b capital b
as in background space dash c as in configuration and then the path to the configuration file dash
f as in file as a capital f file and then the path to the playlist and that's pretty much all you
should need to launch this thing as a demon once it's launched it has now created a mount point
in your ice cast conduit stream type thing meaning that you should be able to now point your browser
or media player to http colon slash slash migrate streaming server.com colon 8000 slash in p3 in my case
like because that's what I named the mount point in the ises configuration file you remember
that we just did a couple of moments ago so now if people point their browser with their media
player to migrate streaming example server.com colon 8000 slash in p3 they will in fact
hear the music on my hard drive that was in my playlist streaming via ises dash cc through
ice cast streaming server to the world and that's it that's done now the other step that you
would probably want to take or at least that I would want to take is to then set up ises without
the dash cc the newer version of ises that only supports aug vorbis and use that to create an
aug stream and that's done exactly the same way it's not a big deal is it's simply creating
another mount point so you've got a slash in p3 and a slash aug mount point both going into the
ises cast conduit and people can point their browser to the slash aug or the slash in p3 now in
real life of course you don't want to have your users to really know that there's a difference right
they users don't understand that they don't understand choice right you just want to send them
to some place and have their browser figure out that they're that they need in in p3 or that
they need an aug stream and you can deliver it to them depending on whichever they actually need
so the way to do that at least the way i did that is to make a really really simple web page it's
not complex and through the magicalness of html 5 it is really really simple and i'll have to post
this i guess on in the show notes but it's it's literally like maybe five lines of code so it is
audio auto play loop controls auto buffer preload equals auto and then the source src equals
http colon slash slash migrate streaming server example dot com colon eight thousand slash in p3
type equals audio slash in p3 closed tag source src equals http colon slash slash migrate streaming
server dot com colon eight thousand slash aug type equals audio slash aug closed tag close audio
and that's it so that's four lines of code it's the html 5 audio tag doing what it does best
which is giving the user an invisible choice between the mp3 stream or the aug stream the browser
of course checks to see which one of those it supports and then it delivers to the user a nice
little in browser play controls and and it'll play the stream for them right there in their in
their in their web browser and in fact you could put some error text there as well so that if
they don't have html 5 it would it would just tell them hey you don't have html 5 you should go
use Firefox or whatever so it that's it's as simple as that i will put that code in the show notes
for you and and you've got it that's it that's that's the long and short of of this whole experience
well not quite of course there's always that catch about the firewall right so if you're doing
this you're just you've got a friend and you guys want to listen to the same music at the same time
or something so you set this thing up you're behind a router you're behind a firewall they can't
get to your streaming server you can hear it inside they can't hear it outside well you should know
by now from my previous episodes on dynamic DNS and SSH and stuff which I should have the
episode number and I don't but it's a long time ago but you should know by now that in order for
someone on the outside to get into your network all you need to do is poke a hole in your firewall
and it's it's it's IP forwarding sometimes it's called virtual server could be called a lot of
different things unfortunately in each router but if you log into your router and it's usually
something like 192.168.1.1 could be different though you kind of have to look at the documentation
for your your particular brand of router to find out but you log into that as the admin you log
in you can go to your firewall or your virtual server or your IP forwarding whatever they call it
and just tell it if someone comes a knocking at this router on port 8000 then send it to
this computer on my network this computer needs to be the one running icecast right so so just
do an if config find out what your IP address is on that computer running icecast and so you would
forward port 8000 from the exterior of your firewall that is from the outside world 8000
route it over to that computer so let's just pretend like that's 192.168.1.11
port 8000 because icecast is still listening on port 8000 so you're forwarding port 8000
from your world IP address whatever you get back from the command curl icon has ip.com
you get that port 8000 from that number forward it to your internal address 192.168.1.11 or whatever
we said it was port 8000 and so now it's it's almost as if there's no firewall for that
you can do fancier things like change the port number you know change the exterior port to
something different like one two eight eight eight and then forward that to port 8000 of 192.168.1.11
however you want to work it you can do it doesn't really matter but you need to do that if you
want the outside world to hear your music so that's always a consideration whatever server you're on
even if you don't have an external firewall you probably have ip tables running or something so
keep that in mind when when testing this out people are trying to tune in and it's rejecting
their connection or whatever remember you've probably got some kind of safety device in place
there and you need to just kind of open up one port on that forward it to your icecast server
and then it will work that's about it for icecast streaming I mean we've we've we've set it up
we've got icecast going we've got ises playing our playlist and ises dash cc playing our playlist
we got dual streams going and we've got an automatic failover web front end that people can use
via html5 to stream whichever type of stream they they want to play it it it automatically detects
what they need and make sure that they get some sound almost no matter what so hope you've enjoyed
this episode I'm going to be back for a little bit on the different methods of automating this
process are not automating but making your little internet radio sort of easy to use and alternate
streaming sources so that you don't necessarily have to use ises and ises dash cc there are other
other solutions some of them have pretty gooey front ends some of them do not and we will check
them out in later episodes thanks for listening
you have been listening to Hacker Public Radio at Hacker Public Radio does our
we are a community podcast network that releases shows every weekday Monday through Friday
today's show like all our shows was contributed by a hbr listener like yourself
if you ever consider recording a podcast then visit our website to find out how easy it really is
Hacker Public Radio was founded by the digital dot pound and the infonomicum computer cloud
hbr is funded by the binary revolution at binref.com all binref projects are proudly sponsored by
linear pages from shared hosting to custom private clouds go to lunar pages.com for all your hosting needs
unless otherwise stasis today's show is released under a creative commons
attribution share a line lead us our lives
