Record Streaming Audio with Linux: Part I
Tuesday, February 28th, 2006Update: For a better solution check out this newer post
I happen to enjoy listening to Glenn Beck. The problem is that I can’t receive his weekday shows where I live. Even if I could receive his weekday show over the air, I wouldn’t hear most of it because I am busy working all day.
The solution: cron and mplayer with a little help from sox.
Here’s a sample script:
-
#!/bin/bash
-
# Use mplayer to capture the stream
-
# at $STREAM to the file $FILE
-
-
DATE=`date +%d-%b-%Y` # Save the date as DD-Mmm-YYYY
-
YEAR=`date +%Y` # Save just the year as YYYY
-
-
# Where you want the file saved. Leave off file extension
-
FILE=/home/shawn/PodCasts/Glenn_Beck_Show_$DATE
-
-
# The following file should be a playlist file such as .asf or .asx
-
# You can also create your own file with a URI and put it here
-
STREAM=/home/shawn/bin/glenn_beck_show-6-9am
-
DURATION=3.1h # enough to catch the show, plus a bit
-
#DURATION=200s # a quick run, just for testing
-
-
# For the id3v2 Tags
-
AUTHOR=“Glenn Beck”
-
ALBUM=“104.7 WPGB-FM Pittsburgh”
-
TITLE=“Glenn Beck Show - $DATE”
-
-
# Capture Stream
-
/usr/bin/mplayer -really-quiet -cache 500 \
-
-ao pcm:file=“$FILE.wav” -vc dummy -vo null \
-
-playlist $STREAM &
-
# the & turns the capture into a background job
-
sleep $DURATION # wait for the show to be over
-
kill $! # kill the stream capture
-
-
# remove gaps and convert to mono
-
sox $FILE.wav -c 1 $FILE-silenced.wav \
-
silence 1 -0.9 2% -1 -0.9 2% ;
-
rm $FILE.wav ; #remove original capture
-
-
# Encode to .mp3, mono 32kHz 32kb/s, and tag the file
-
lame -a -m m –tt “$TITLE” –ta “$AUTHOR” \
-
–tl “$ALBUM” –ty “$YEAR” –vbr-new -V 9 \
-
–resample 32 $FILE-silenced.wav $FILE.mp3 ;
-
rm $FILE-silenced.wav # Remove the raw audio data file
Once all of the variables have been set, make this executable and make a cron job for it.
crontab -e
Here’s an example for starting at 6am every weekday:
-
0 6 * * 1-5 /home/shawn/bin/glenn_beck.sh>& /dev/null
Notes
- The basis for this script is the one found at this Linux Journal article.
- You need at least SoX version 12.17.9 for the silence filter to work properly.
- MPlayer should be fairly recent. Older versions have a different syntax for pcm (wav) audio output
- This solution still requires huge amounts of disk space (~500MB/hour). I am still experimenting with using named pipes (fifos) to do all of the file processing in RAM and only output the final encoded file to the disk.




My Uncle just recently moved into a different apartment complex. I won’t say that it’s new, because it’s not. I was helping him by setting up his computer for him and getting him to the point where he can get on “the intarweb.” He told me that I could park anywhere. Furthermore, he told me when we got there which parking space to park in. I was there from around 8:00pm until almost 11:00pm. The computer is really slow and they just moved in so there are boxed and things everywhere. Most of the time spent was trying to find all the components and cables and get them plugged in somewhere. After a long while I was finally able to return home. It had not been a fun experience.

