Icecast

From ArchWiki
Jump to navigation Jump to search

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements. See Help:Style for reference.Tango-edit-clear.png

Reason: See Help:Style. (Discuss in Talk:Icecast#)

Icecast is a program for streaming media such as audio and video across a network. Different types of clients connect to the IceCast server, either to provide a "mount point", control the server, or listen to the audio being cast.

Icecast has support for streaming many audio streams simultaneously - each stream has a "mount point" which a client can access, with a network URI such as http://localhost:8000/example.ogg.m3u (this refers to a mount point called "example").

Installation

Install icecast.

Alternatively, you can build and install the icecast-khAUR package. Icecast-kh (Karl Heyes) extends on the official release with features that may be (if found to be working out well) merged into next official releases.

Configuration

All configuration is done in /etc/icecast.xml.

Warning: Before starting icecast make sure to change the default passwords in the <authentication> section!

By default icecast listens on port 8000. It can listen on more than one port - this behavior can be changed by modifying one or more <listen-socket> sections.

Note: Although icecast allows to freely configure the FQDN in the <hostname> section, for simplicity's sake localhost is assumed throughout this article.

Icecast binds to all interfaces (i.e. 0.0.0.0) by default. To change this behavior, modify a <bind-address> section below a respective <listen-socket> section.

To set defaults for all mounts that do not specify their type (e.g. <mount type="normal">) the <mount type="default"> section can be modified:

/etc/icecast.xml
<mount type="default">
  <public>0</public>
  <intro>/stream.m3u</intro>
  <max-listener-duration>3600</max-listener-duration>
  <authentication type="url">
    <option name="mount_add" value="http://auth.example.org/stream_start.php"/>
  </authentication>
  <http-headers>
    <header name="foo" value="bar" />
  </http-headers>
</mount>
Note: The icecast.service runs as the icecast user. Setting a user and group to change to in the <changeowner> section below <security> is not required and is not recommended.

Running

Enable and start icecast.service.

To verify that icecast is running go to http://localhost:8000/ or check the status of icecast.service.

Streaming

Several programs are able to stream to icecast based on a <source-password> set in the <authentication> section of the configuration.

Note: The icecast.service has to be started before streaming to it.

MPD

Note: MPD has its own built-in HTTP Streaming, and using Icecast+mpd may not be needed. See Music Player Daemon : HTTP Streaming for more information.

Make sure to setup MPD and a client to control it.

Configure MPD (as system or user service) to be an icecast source:

mpd.conf
audio_output {
    type        "shout"
    encoding    "ogg"
    name        "my cool stream"
    host        "localhost"
    port        "8000"
    mount       "/example.ogg"
    user        "source"
    password    "<source-password>"

# Set either quality or bit rate
#   quality     "5.0"
    bitrate     "64"
    format      "44100:16:1"
# Optional Parameters
#   description "here is my long description"
#   genre       "jazz"
}

# Need this so that mpd still works if icecast is not running
audio_output {
    type "null"
    name "fake out"
}

Start mpd.service.

The icecast web interface should now list this new stream and the playlist should be available as http://localhost:8000/example.ogg.m3u

Oggfwd and ffmpeg2theora

Install the ffmpeg2theora and oggfwdAUR packages.

Pipe ffmpeg2theora output of an audio file to oggfwd, which forwards to the icecast server.

$ ffmpeg2theora --no-skeleton --novideo -o - path/to/audio/file | oggfwd localhost 8000 source-password /mount.ogg

Alternatively, use the following script:

#!/bin/sh

if [ $# -eq 1 ] 
then
  music="$1"
else
  echo "Usage: $0 music-file"
  exit 1
fi

pass="source_password"
mountpt="mount_point_name"

set -e
ffmpeg2theora --no-skeleton --novideo -o - "$music" 2> /dev/null | \ 
  oggfwd localhost 8000 "$pass" /"$mountpt".ogg

ezstream

ezstreamAUR is a native source client for icecast. It shares similar config as icecast, *.xml file.

Sevaral examples can be found in /usr/share/examples/ezstream/. It supports mp3, Ogg Vorbis, Ogg Theora, for streaming video ffmpeg2theora can be used to reencode into Ogg Theora.

After configuring, stream can be started by

$ ezstream -c /path/to/flie.xml

Multiple media can streamed by creating a m3u playlist and defining it under <intakes> in config file

<intakes>
   <intake>
	<type>playlist</type>
	<filename>playlist.m3u</filename>
   </intake>
</intakes>

XMMS2

xmms2 is a minimal music player which can be controled with several clients, setting this up is fairly simple compared to MPD and media can be added to stream on fly unlike ezstream.

List of icecast config can be found by,

$ xmms2 server config | grep ices

ices.encodingmaxbr = -1
ices.encodingminbr = -1
ices.encodingnombr = 96000
ices.host = localhost
ices.mount = /stream.ogg
ices.password = hackme
ices.port = 8000
ices.public = 
ices.streamdescription = 
ices.streamgenre = 
ices.streamname = 
ices.streamurl = 
ices.user = source

These can be changed as follows,

$ xmms2 server config ices.password my_password
$ xmms2 server config ices.port 5080
$ xmms2 server config ices.public 1

Change the output as ices so XMMS2 can mount the stream on icecast server.

$ xmms2 server config output.plugin ices

Upon starting, the stream should be working and files can be added with the command "add".

Alternatively, XMMS2 can be controlled with lxmusic which provides a simple GUI.

Playback

Streams can be listened to via a web browser when visiting http://localhost:8000.

Additionally, there are several clients that can make direct use of a provided playlist file (e.g. http://localhost:8000/example.ogg.m3u)

MPD

Icecast streams can be played back using MPD.

Use an MPD client such as mpc to add the URL of an icecast playlist file to the playlist of a (local) MPD instance:

$ mpc add http://localhost:8000/example.ogg.m3u

The added item behaves like any other track in the MPD playlist.

MPlayer

Install the mplayer package.

Start the program and provide it with the icecast playlist:

$ mplayer -playlist http://localhost:8000/example.ogg.m3u

Mpv

Install the mpv package.

Start the program and point it at the icecast playlist:

$ mpv http://localhost:8000/example.ogg.m3u

Sonata

  • Install the sonataAUR package.
  • Start it up and you should be greeted by Sonata's preferences.
  • Set 'Name' to the name of your server.
  • Set 'Host' to the IP address of your server.
  • Set 'Port' to '6600'.
  • Click the '+' and repeat the previous steps but instead about your local computer (i.e. its name and IP).
  • Right-click->'Connections' and select your server. Then click on the 'Library' tab, if all is well, you should see your entire music selection that is on your server. Find a folder, right-click and click 'Add'. Clicking on the 'Current' tab will show you your current playlist, which should have the contents of whatever folder you just chose from the library. Double-click on a song. You should see the text get bold and the progress bar show up, just like it is playing, but you will not hear anything. Fear not.
  • Right-click->'Connections' and select your local computer. Then click the 'Streams' tab. Right-click and click 'New'. Make 'Stream Name' the name from your servers /etc/mpd.conf file's audio_output { } section and make the URL IP.of.server:8000/example.ogg.m3u. Double-click on this stream.
  • Click on the 'Current' tab and you will see the URL of the stream as your only item. Double-click on it and after a delay you should hear whatever song you had chosen on the server.

Tips and tricks

Running Icecast in a chroot environment

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Since icecast 2.4.4-2 the systemd service is started as the separate user icecast and does not require setting up a user/group pair to change to in the <changeowner> section of the configuration anymore. This might have consequences to the way chroot setups have been done previously. (Discuss in Talk:Icecast#)

Change following settings in `/etc/icecast.xml`:

<chroot>1</chroot>

Add these line to the section `[Service]` in `/usr/lib/systemd/system/icecast.service`:

WorkingDirectory=/usr/share/icecast

Now change this entries in `/etc/icecast.xml`:

<logdir>./log</logdir>
<webroot>./web</webroot>
<adminroot>./admin</adminroot>
<pidfile>./icecast.pid</pidfile>

Create a log directory under `/usr/share/icecast` and set the permissions:

# cd /usr/share/icecast
# mkdir log
# cd log
# touch access.log playlist.log error.log
# cd ..
# chown -R icecast:icecast log/

Local user

Note that if you are running icecast under a local user (i.e. one that does not use /etc/icecast.xml) then you will need to copy the icecast web xml files from /usr/share otherwise you will get errors about XSLT and the web interface will not work.

$ cp -R /usr/share/icecast/web ~/icecast/

Also, make sure that the <changeowner> section in the icecast configuration file is commented out, as changing the owner of a process requires root privileges.

See also