Table of Contents
TV recording using mencoder
Sometimes there is a show on TV I want to record for watching it later. I have a TV card in the ding to do this. It's an old MiroPCTV card sold by Pinnacle. Here is what /proc/pci
has to say:
Bus 0, device 8, function 0: Multimedia video controller: Brooktree Corporation Bt848 Video Capture (rev 18). IRQ 5. Master Capable. Latency=32. Min Gnt=16.Max Lat=40. Prefetchable 32 bit memory at 0xef000000 [0xef000fff].
Kernel Support
Here are the modules I did select in the kernel configuration to get the TV card running.
Character devices ---> I2C support ---> <M> I2C support <M> I2C bit-banging interfaces Multimedia devices ---> <M> Video For Linux Video For Linux ---> [*] V4L information in proc filesystem <M> BT848 Video For Linux Sound ---> <M> Sound card support <M> BT878 audio dma <M> TV card (bt848) mixer support
Recording Script
I use MPlayers mencoder
to record directly to DIVX with the following script:
#!/bin/sh #Duration in seconds TIME=$1 #Channel like S35 or E12 CH=$2 #name of program (filename) NAME=$3 #Where to put the stuff OUTDIR="/ftp/disk1/upload" OUT="$OUTDIR/$NAME.avi" #Bitrate for video encoding VBR=500 #Audiobitrate ABR=96 #mencoder ME='/usr/bin/mencoder' CMD="$ME tv:// -tv driver=v4l:width=384:height=288:norm=pal:amode=0:adevice=/dev/dsp:channel=$CH:buffersize=64 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$VBR:vhq -oac mp3lame -lameopts cbr:br=$ABR -endpos $TIME -sws 1 -o $OUT" echo "recsrc PhoneIn" | /usr/local/bin/smixer -s - echo "vol PhoneIn 60" | /usr/local/bin/smixer -s - $CMD echo "vol PhoneIn 0" | /usr/local/bin/smixer -s -
The script uses smixer to set the soundcard's recording source and volume. It accepts three paramters: the duration of the show to record in seconds, the channel name, and the name of the file to save (without path and extension).
For more info on the mencoder options used see http://mplayerhq.hu/DOCS/HTML/en/tv-input.html
Programmed Recording
To program this VCR I use at
(#> apt-get install at
) and the following little bash script which uses dialog
(#> apt-get install dialog
) to ask all needed information interactively:
#!/bin/bash RECORDER="/home/mm/recordtv.sh"; OPTS='--stdout --no-shadow --clear --backtitle "TV-Recorder"' NAME=`dialog $OPTS --title "Title" --inputbox "Please name the program to record (avoid special chars)" 0 0 "tvprogram"` if test $? -ne 0 ; then exit; fi PROG=`dialog $OPTS --title "Station" --menu "Choose a station" 0 0 5 \ "E10" "ARD" \ "E8" "ZDF" \ "SE4" "Arte" \ "SE19" "Phoenix" \ "E7" "ORB" \ "E6" "SFB1" \ "SE15" "BR" \ "S22" "WDR" \ "SE17" "NDR" \ "SE18" "MDR" \ "SE9" "3SAT" \ "S35" "XXP" \ "SE20" "Pro7" \ "E9" "Sat1" \ "E11" "RTL" \ "SE13" "RTL2" \ "SE21" "Super RTL" \ "SE6" "Kabel1" \ "SE11" "VOX"` if test $? -ne 0 ; then exit; fi DATE=`dialog $OPTS --title "Startdate" --calendar "Select the day when the recording starts" 0 0` if test $? -ne 0 ; then exit; fi DATE=`echo $DATE | sed -e 's/\//./g'` START=`dialog $OPTS --title "Starttime" --timebox "Please set the starttime of the program" 0 0` if test $? -ne 0 ; then exit; fi START="`echo $START | cut -d : -f 1`:`echo $START | cut -d : -f 2`"; TIME=`dialog $OPTS --title "Duration" --timebox "Please set the duration of the program" 0 0 0 0 0` if test $? -ne 0 ; then exit; fi #Calculate seconds from TIME: THRS=`echo $TIME | cut -d : -f 1` THRS=`expr $THRS \* 3600` TMIN=`echo $TIME | cut -d : -f 2` TMIN=`expr $TMIN \* 60` TSEC=`echo $TIME | cut -d : -f 3` TIME=`expr $THRS + $TMIN` TIME=`expr $TIME + $TSEC` dialog $OPTS --title "Confirmation" --yesno \ "I will record the TV-Show '$NAME' on channel $PROG. \ It starts at $DATE $START and runs $TIME seconds. Is that okay?" 0 0 if test $? -ne 0 ; then exit; fi echo "$RECORDER $TIME $PROG \"$NAME\"" | at $START $DATE
Note: at
has a known bug which prevents it from working when /var
is a mounted NFS partition. However for me it works as root
not as normal user regardless of the set SUID bit.