My partner has been overseas for a few months and was desperately missing a local radio station. It doesn’t have an online stream that she can listen to and so she asked me whether I could record the station for ten hours – this just sounded like a hassle, so I set up an internet streaming station to permanently re-stream the local broadcast over the internet using my Raspberry Pi, a cheap USB sound card, a cheap DAB digial radio, and darkice/icecast to run the streaming server.
The output of lsusb showed the cheap USB sound card to be a “C-Media Electronics, Inc. CM108 Audio Controller”. I found that I could access the device using ALSA and the arecord utility (as long as I didn’t specify 2 channels):
1 |
arecord -D hw:1,1 -f s16_le > test.wav |
Next, I tried to set up icecast2 with darkice. I’m using Raspbian and the standard raspbian-distributed package for darkice is not compiled with ALSA support, and I nearly fell down a rabbit-hole trying to get OSS-compatible emulation working.
In the end, I was able to compile and install darkice with ALSA and mp3 support by following the excellent instructions here:
http://mattkaar.com/blog/2013/05/26/web-streaming-with-the-raspberry-pi-baby-monitor/
My darkice.cfg file looks like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[general] duration = 0 # duration of encoding, in seconds. 0 means forever bufferSecs = 5 # size of internal slip buffer, in seconds reconnect = yes # reconnect to the server(s) if disconnected # this section describes the audio input that will be streamed [input] device = hw:1,0 # Alsa 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 = vbr # variable bit rate format = mp3 # format of the stream: mp3 quality = 0.6 # quality of the stream sent to the server server = localhost # host name of the server port = 8000 # port of the IceCast2 server, usually 8000 password = ****** # source password to the IceCast2 server mountPoint = 1080 # mount point of this stream on the IceCast2 server name = 6ix - Forever Classic # name of the stream description = DarkIce on RasPi # description of the stream #url = http://192.168.88.17 # URL related to the stream genre = Forever Classic # genre of the stream public = no # advertise this stream? localDumpFile = recording.mp3 # Record also to a file |
The setup works beautifully and CPU (original rPi) hits around 25% per streaming client. Since I only expect to stream to one client, this is fine.
As AM has quite a limited bandwidth I expect I could drastically lower the bitrate that darkice is encoding at, and also add a highpass parameter to filter out any noise.
To round off the project I also made the rPi serve a little webpage, with a link to .m3u file plus an embedded HTML5 player:
1 |
<audio style="margin-top: 0px;" autoplay="autoplay" controls="controls"><source src="http://radio.jeremyhall.com.au:8000/1080" type="audio/mp3" />Your browser does not support the audio element.</audio> |
Hear it here: radio.jeremyhall.com.au
Finally, I made darkice run as a service using daemontools using the instructions on this stackexchange post: http://unix.stackexchange.com/questions/92545/starting-darkice-automatically-via-daemontools
Update: It’s still running strong a few months later. Having now joined my partner overseas, we listen to it every day!
Second update (June 2017): The radio station that was being re-streamed has now started their own official stream, so my stream is no longer running.
Modbus TCP Temperature Sensor with Arduino and LM335
I used to hate on Arduino a bit, but have recently come around. I was having a conversation with a work colleague along the lines of how super easy it would be ... Read more
Monitoring and reporting 3G radio signal-strength (RSSI, dBm) on Mikrotik Routerboards
Monitoring a large number of Mikrotik Routerboards is easy using software and tools like LibreNMS and Oxidized, but it is unfortunately not possible to retrieve values for 3G/4G/etc signal-strength RSSI (in dBm) ... Read more