Archive for February, 2006

Record Streaming Audio with Linux: Part I

Tuesday, February 28th, 2006

Update: 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:

  1. #!/bin/bash
  2. # Use mplayer to capture the stream
  3. # at $STREAM to the file $FILE
  4.  
  5. DATE=`date +%d-%b-%Y`  # Save the date as DD-Mmm-YYYY
  6. YEAR=`date +%Y` # Save just the year as YYYY
  7.  
  8. # Where you want the file saved.  Leave off file extension
  9. FILE=/home/shawn/PodCasts/Glenn_Beck_Show_$DATE
  10.  
  11. # The following file should be a playlist file such as .asf or .asx
  12. # You can also create your own file with a URI and put it here
  13. STREAM=/home/shawn/bin/glenn_beck_show-6-9am
  14. DURATION=3.1h # enough to catch the show, plus a bit
  15. #DURATION=200s # a quick run, just for testing
  16.  
  17. # For the id3v2 Tags
  18. AUTHOR="Glenn Beck"
  19. ALBUM="104.7 WPGB-FM Pittsburgh"
  20. TITLE="Glenn Beck Show - $DATE"
  21.  
  22. # Capture Stream
  23. /usr/bin/mplayer -really-quiet -cache 500 \
  24.     -ao pcm:file="$FILE.wav" -vc dummy -vo null \
  25.     -playlist $STREAM &
  26. # the & turns the capture into a background job
  27. sleep $DURATION  # wait for the show to be over
  28. kill $! # kill the stream capture
  29.  
  30. # remove gaps and convert to mono
  31. sox $FILE.wav -c 1 $FILE-silenced.wav \
  32.      silence 1 -0.9 2% -1 -0.9 2% ;
  33. rm $FILE.wav ; #remove original capture
  34.  
  35. # Encode to .mp3, mono 32kHz 32kb/s, and tag the file
  36. lame -a -m m --tt "$TITLE" --ta "$AUTHOR" \
  37.      --tl "$ALBUM" --ty "$YEAR" --vbr-new -V 9 \
  38.      --resample 32 $FILE-silenced.wav $FILE.mp3 ;
  39. 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:

  1. 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.