Radio Streaming on FreeBSD 10 with IceCast and Ices

Published on: Wed, Apr 22, 2015 at 7:08 pm EST
BSD Server Apps

The following tutorial explains how to set up a IceCast radio streaming server and play audio files (music or podcasts) on the FreeBSD platform. This tutorial assumes that you are running FreeBSD 10.0 or higher and that you are logged in as the root user. It also assumed that you have a text editor to edit configuration files.

Before we begin, it is important to understand the three parts of an audio streaming server. First, we have the server software itself, IceCast. IceCast acts like a central hub where audio streams come in and get sent out. The IceCast service takes in audio streams from source clients. Source clients are programs which read audio files or other sources of audio, such as microphones. In our example, the source client is Ices and it supplies an audio stream to the IceCast server. The third component is a listening client. Audio streams travel from the IceCast server to listeners who then hear the audio. Typically a listening client is a desktop application, such as a web browser, the VLC multimedia player, or WinAMP. Visually, the arrangement looks like this:

 Source client (Ices) --> IceCast server --> Listening client (browser)

To set up an IceCast streaming server on FreeBSD, we first install the server software itself. This can be done by running the following command.

 pkg install icecast2

We then open the /etc/rc.conf file and enable the IceCast background service. This is done by appending the following text to the bottom of the /etc/rc.conf file.

 icecast_enable="YES"

Our next step is to configure the IceCast service. The IceCast package ships with a sample configuration file that we can modify. This sample file is located in the /usr/local/etc directory. We will make a copy of this sample file before editing it.

 cd /usr/local/etc
 cp icecast.xml.sample icecast.xml

We now want to edit a few key fields of the icecast.xml file. Most of the file can be left with the default settings, but we should change the login information. We can do this by visiting the authentication section (at about line 30) and changing the source-password and relay-password to something appropriate. These passwords will allow us to stream data to the IceCast server from a source client. We should also change the admin-user and admin-password variables to something unique to our system. These two credentials guard the IceCast server's web-based interface. Then, down around line 150, we should change the variables mount-name, username, and password. These three variables protect the IceCast server's mount point. Finally, at the bottom of the icecast.xml file we should see a security section that has been commented out. We should remove the opening <-- and closing --> symbols from around the security paragraph. Once the icecast.xml file has been changed, save the file.

Once the configuration file has been edited, we want to enable logging. To do this, run the following commands.

 mkdir /var/log/icecast
 chown nobody:nogroup /var/log/icecast

Finally, we start the IceCast server, This causes the server to listen for input and incoming client connections.

 service icecast2 start

The IceCast server is up and running, so now we need to provide it with something to play. Our next step is to install the Ices source client. FreeBSD currently does not offer a binary package for Ices, so we need to build it from ports. This can be done by running the following commands.

 portsnap fetch
 portsnap extract
 cd /usr/ports/audio/ices
 make install
 make clean

The Ices source client will need a user account and logging. To create a user for the Ices software and set a password on the account, run these commands.

 pw groupadd ice
 pw useradd ices -g ice -m
 passwd ices

With the user created, we can now enable logging for Ices.

 mkdir /var/log/ices
 chown ices:ice /var/log/ices

From here on, we should no longer need root user access and can operate as the ices user. Next, we need to create two directories. One directory, music, will contain the audio files that we are going to stream. The second directory, conf, will contain our configuration files.

 su ices
 cd /home/ices
 mkdir music conf
 cp /usr/local/share/ices/ices-playlist.xml conf/configuration.xml

We now have a sample configuration file in place. It is time to edit the conf/configuration.xml file to suit our environment. The only parts of the file that we need to change are down around line 60. Here we need to provide the password and mount location we set in the icecast.xml file. For example, if we set our mount name in the icecast.xml file to be /radio.ogg, then we should change our configuration.xml file's mount parameter to also be /radio.ogg. Our password field in configuration.xml should match the source-password we created in the icecast.xml file. Once our configuration.xml file has been edited, we will need to save our changes.

With the configuration file in place, the next step should be to copy audio files that we wish to stream into the music directory. The audio files should all be in .ogg format as IceCast will not handle .mp3 files with its default settings. Once all of the audio files that we wish to stream are in the music directory, we need to create a playlist. A playlist is a plain text file with a list of the music that we want to stream. We can easily create a playlist with the following commands.

 cd /home/ices/conf
 ls -d ../music/*.ogg > playlist.txt

The audio files will be played in the order they appear in the playlist.txt file. The file can be edited in any text editor to adjust the order of the streaming audio.

All that we need to do to begin streaming our audio files is to run this command.

 ices configuration.xml

Side note: Often we may want to run the Ices source client and then logout and go do something else. In that case, I like to run Ices from within a screen session. Here is an example on how to run ices with screen.

 screen
 cd /home/ices/conf
 ices configuration.xml

Then press Ctrl + A and tap the D key. That will detach the screen session and allow us to logout while Ices plays audio in the background. Later, we can halt Ices by logging in and running:

 screen -r
 killall ices
 exit

We can now connect to our server on port 8000 in a web browser to listen to our audio stream. The URL will look like http://myservername:8000. This address can be made publicly available if you want to let others listen to the stream.

Earlier, I mentioned that IceCast plays .ogg files and not .mp3. This is fairly easy to overcome on FreeBSD. As the root user, we can install a conversion tool, called sox, which will convert our .mp3 files to .ogg files. Assuming all our .mp3 files are in the /home/ices/music directory, we can install sox and perform a conversion as follows:

 pkg install sox
 cd /home/ices/music
 for i in *.mp3; do sox ./"$i" ./"$i".ogg; done

We can then refresh our playlist using:

 cd ../conf
 ls -d ../music/*.ogg > playlist.txt

Please keep in mind that audio streaming can be bandwidth intensive. One or two clients listening to our radio station will not require much bandwidth, but 50 or more clients could push a server over its allotted monthly bandwidth. It is a good idea to enable bandwidth capping on the streaming server to avoid unexpected financial costs.

Want to contribute ?

You could earn up to $300 by adding new articles