This is an old revision of the document!
Hello, this is a note-scrape-no-paper-book for a paper i should submit for a class on my university. It is about streaming under linux. I will slowly develop it also after submitting it, as streaming is of big interest for me.
I work for Tlis which is a internet-students radio, where i maintain the streaming server, and also manage programming. I am also a founding member of Itchy Bit, 1) organization and platform for promoting hybrids of arts, social activity and technology.
Here is one simillar, but older article focused on audio streaming under Linux.
Streaming is a way how to produce and process media so that they can be seen during downloading. To be able to do this the media has to be compressed to achieve a good speed. There are severall codecs which do the compression, and in this wiki we will pay more attention to the free ones.
Streaming content is delivered through the network, and there are three man types of delivering it: unicast, broadcast and multicast. There are terms used also anywhere where routing comes into play. Unicast just transmits data to a single point. Broadcast and Multicast transmit data to many points at once. The difference is, that broadcast sends a copy of the stream to every single user who wants it, while Multicast works so, that it sends out only a single copy at a time, which is copied for various users along the way to them. This needs a lot of computation from the side of routers, so the majority of Internet backbone routers has Multicast disabled, even though the paradigm is known since late 80's.
Multicast is used mainly in company private networks for e-learning and e-conferencing. Broadcast is nowadays the most used way how to send streamed media to the users. It is also ineffective in that sense, that when 10000 people want to see your stream at once (at a given bitrate), you have to have a connection to the internet which can handle 10000*bitrate throughput.
Another emerging way of delivering streaming data is swarm streaming. It utilizes the ideas behind the bittorent technology - the media is sent to severall people at once, each of whom gets a different part of the streamed media, and they communicate and exchange the parts between themselves. In this way the streaming point doesnt need a good connection in cases of big interest. One nice open-source example is Tribler Streaming.
The architecture is an abstract structure of streaming solutions. It usually consists of three independet points: source, repeater and the receiving client. In this way, the source can be on a slow link, just pushing data to a repeater which is conneced to a broad-enough link. The communication between all the members uses the ip protocol, and mostly UDP, but that depends on the solution.
In this section we cover two main forms of audio streaming under linux: mp3 and ogg. We will use the Icecast Streaming Server as an repeater. We will not pay attention to other formats, like realmedia or windows media. Quicktime is a possibility, since Darwin Streaming Server is free to download from Apple. 2).
Any sound-input routed into the soundcard. Controllable through ALSA or OSS. Possible to steer audio in Jack. Can be also a XMMS player. There two main alternatives:
In case of sound you can use various softwares, icecast people have released a number of ices bindings to different programming languages, so the possibilities are broad. The most used are:
In case of various music-playing or music-producing products, the capability to send out the data to a streaming-server is allready built-in or uses the possibillity of plugins. An example is the player Xmms, for which exists a plugin sending the played music directly to the Streaming server. Another example is Muse software, or software for music production like pure-data..
Darwin Streaming Server is a free streaming server from Apple. It should run under under Linux - from the link you can download 3) the source code or packages for Fedora Core. Ill try to make it run here, then i report.
Shoutcast is runnable under Linux, but has a weird licence, and you get a precompiled binary. Shoutcast is able to stream only data in .mp3 format, which in itself is problematic under linux. There is no licence needed for using mp3 format for uncommercial purposes:
Do I need a license to stream mp3, mp3PRO or mp3surround encoded content over the Internet? Yes. A license is needed for commercial (i.e., revenue-generating) use of mp3/mp3PRO in broadcast systems (terrestrial, satellite, cable and/or other distribution channels), streaming applications (via Internet, intranets and/or other networks), other content distribution systems (pay-audio or audio-on-demand applications and the like) or for use of mp3/mp3PRO on physical media (compact discs, digital versatile discs, semiconductor chips, hard drives, memory cards and the like). However, no license is needed for private, non-commercial activities (e.g., home-entertainment, receiving broadcasts and creating a personal music library), not generating revenue or other consideration of any kind or for entities with associated annual gross revenue less than US$ 100 000.00.
IceCast is open-source and distributable under GNU\GPL licence. It is the most used open-souce streaming server nowadays. It has a nice and simple functionality, is reliable and robust and can stream audio as well as video formats.
First of we should have a streaming server allready installed and at our disposal. If true, goto here. If not, we will install our streaming server now. I chose IceCast.
get the libogg:
get the libvorbis:
tar -xzvf icecast-2.3.1.tar.gz
configure && make. The path to libogg can be different on your system, and depends on YOUR settings.
Now just run icecast
icecast -c /usr/local/etc/icecast.xml
Depends on settings but the admin interface is on http://ip-of-server:8000/admin/
source “puts up” the data, with a password, then mounts it on some mountpoint. The mountpoint is accessible through: http://ip-of=server:8000/mountpoint_name
Icecast is able to stream .ogg streams and also mp3. Newest addistions include the Theora library which is used for streaming video in ogg/theora format.
Here is an an example of an icecast configuration file, used for the streaming server of Tlis Students Radio where i work:
<icecast> <limits> <clients>1000</clients> <sources>5</sources> <threadpool>8</threadpool> <queue-size>262144</queue-size> <client-timeout>30</client-timeout> <header-timeout>15</header-timeout> <source-timeout>10</source-timeout> <burst-on-connect>1</burst-on-connect> <burst-size>65535</burst-size> </limits> <authentication> <source-password>*****</source-password> <relay-password>******</relay-password> <admin-user>*****</admin-user> <admin-password>*****</admin-password> </authentication> <directory> <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>tlis.sk</hostname> <listen-socket> <port>8000</port> </listen-socket> <fileserve>1</fileserve> <paths> <basedir>/opt/icecast</basedir> <logdir>/log</logdir> <webroot>/share/icecast/web</webroot> <adminroot>/share/icecast/admin</adminroot> <alias source="/" dest="/status.xsl"/> </paths> <logging> <accesslog>access.log</accesslog> <errorlog>error.log</errorlog> <loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error --> </logging> <security> <chroot>1</chroot> <changeowner> <user>icecast</user> <group>nogroup</group> </changeowner> </security> </icecast>
As an stream forwarder we will use darkice. Its robust, command-line orientated, and fast. It can be used to send data to IceCast, Shotcast and Darwin Streaming Server. We compile darkice from the sources. There are some libraries needed. The we just modify an .conf file, for example /etc/darkice.conf:
# this section describes general aspects of the live streaming session [general] duration = 0 # duration of encoding, in seconds. 0 means forever bufferSecs = 5 # size of internal slip buffer, in seconds # this section describes the audio input that will be streamed [input] device = /dev/dsp # OSS DSP soundcard device for the audio input sampleRate = 44100 # sample rate in Hz. try 11025, 22050 or 44100 bitsPerSample = 16 # bits per sample. try 16 channel = 1 # channels. 1 = mono, 2 = stereo # this section describes a streaming connection to an IceCast2 server # there may be up to 8 of these sections, named [icecast2-0] ... [icecast2-7] # these can be mixed with [icecast-x] and [shoutcast-x] sections [icecast2-0] bitrateMode = abr # average bit rate format = vorbis # format of the stream: ogg vorbis bitrate = 48 # bitrate of the stream sent to the server quality = 0.9 #sampleRate = 16000 server = tlis.sk port = 8000 # port of the IceCast2 server, usually 8000 username = source password = ****** # source password to the IceCast2 server mountPoint = live.ogg # mount point of this stream on the IceCast2 server name = IRS TLIS LIVE description = College Radio Bratislava, Slovakia >> www.tlis.sk url = http://www.tlis.sk/ genre = Mixed # genre of the stream public = yes # advertise this stream? [icecast2-1] bitrateMode = abr # average bit rate format = vorbis # format of the stream: ogg vorbis bitrate = 128 # bitrate of the stream sent to the server quality = 0.9 #sampleRate = 16000 server = tlis.sk port = 8000 # port of the IceCast2 server, usually 8000 username = source password = ******* # source password to the IceCast2 server mountPoint = live_128.ogg # mount point of this stream on the IceCast2 server name = IRS TLIS LIVE description = College Radio Bratislava, Slovakia >> www.tlis.sk url = http://www.tlis.sk/ genre = Mixed # genre of the stream public = yes # advertise this stream?
After modification we just run darkice -c /etc/darkice.cfg, and everything we receive in the input device (/dev/dsp) is being forwarded to our streaming server. So lets put something into the input device :) The best and easiest way is to run an XMMS and just play some music. If you want to mix it, it is better to try some mixing software, for example mixxx 5)
Video streaming under Linux was, for licencing issues a bit weak, until Xiph Foundation came with libtheora and with it the OGG/Theora format. As Theora is built upon a free video-codec, which can be fitted into any container. The most used “container” is the OGG format, which when using with Ogg/Vorbis audio, gives a completely free multimedia streaming format. This is now something like the flagship of open-source streaming, so we will cover only this option.
You need to have either the video on your harddisk, or for live streaming, a FireWire compatible Camera, and firewire enabled in linux. I will not go into this, but it is the main source of problems, when the ieee1394 is not working.
We pretend we have ieee1394 running. We should have also installed dvgrab:
This grabs the input from firewire, converts it to .ogg and sends output to standard-out:
dvgrab --format raw - | ffmpeg2theora -a 0 -v 5 -f dv -x 320 -y 240 -o /dev/stdout
We install another utility called oggfwd and send the stdout to theora-enabled icecast server:
dvgrab --format raw - | ffmpeg2theora -a 0 -v 5 -f dv -x 320 -y 240 -o /dev/stdout - | oggfwd icecastserver 8000 pwd /theora.ogg
icecastserver - is the url of our streaming server
8000 - can be any number for port number of icecast listener
pwd - password
/theora.ogg - mountpoint where we wish to have the video stream accesible
To use the Ogg/Theora options, we will need an libtheora enabled installation of IceCast Streaming Server. We download the additional libraries (we expect that we have allready installed libogg and libvorbis):
then recompile icecast with these options (the exact location of the libs depends on YOUR settings)
./configure --with-ogg=/usr/local/lib --with-vorbis=/usr/local/lib --with-theora=/usr/local/lib
All other options and setup is the same as with Audio. If you allready have IceCast installed, then just recompile, and thats all.
Setup of the desired player depends on the user ;) If you finally found the player dear to your heart, just open the url: http://ip_of_streaming_server:8000/mount_point.ogg