VCR-HOWTO - Using your GNU/Linux computer as a VCR: Implementation

Next Previous Contents

## 3. Implementation

Now lets go through the steps of actually configuring your computer as a VCR.

## 3.1 Install and Configure Tuner Card

My particular tuner card required special parameters to the 'tuner' and 'bttv' modules because it was an older model and wasn't properly auto-detected. If you can watch TV through your card via xawtv, then you have correctly configured your card. Here are the configuration lines from my /etc/modules.conf (or /etc/conf.modules for older distributions).

    options -k bttv radio=1 card=2
    options -k tuner debug=0 type=6

These parameters will vary depending on the model of your card, see the documentation found in the linux source (linux/Documentation/video4linux) to figure out exactly how to configure your card. I added these modules to /etc/modules so they would automatically load on bootup. You can also manually load them with 'modprobe modulename' as root. I'm currently using the 2.4.2 kernel, but I have had success with this card with all of the 2.2.x kernels as well. Hint: the user may need to have ownership of the /dev/video /dev/video0 files (and maybe other devices as well) before the tuner card will function. As always, I suggest not running any apps as root.

## 3.2 Configure xawtv to function properly.

You can either use xawtv from a reasonably current distribution, or download the source code from the xawtv Homepage Make sure xawtv functions for your tuner card before proceeding.

### Sample .xawtv configuration file.

Here is a sample ".xawtv" configuration file. This should be placed within the home directory for the user who will be doing the VCR recording. I suggest adding presets to your .xawtv file for all channels(0-NNN) (even non-existing ones) because you will use the "v4lctl" command to switch channels later. This command makes use of 'preset number' rather than 'channel number', so it's convenient to have preset numbers be the same as actual channel numbers. The following configuration file was designed for US-cable, your mileage may vary.

    [global]
    freqtab = us-cable
    pixsize = 128 x 96
    pixcols = 1
    jpeg-quality = 75
    mjpeg-quality = 75
    toggle-mouse = 0
    keypad-ntsc = no
    osd = yes

    # [Station name]
    # capture = overlay | grabdisplay | on | off
    # input = Television | Composite1 | S-Video | ...
    # norm = PAL | NTSC | SECAM | ...
    # channel = #
    # fine = # (-128..+127)
    # key = keysym | modifier+keysym
    # color = #
    # bright = #
    # hue = #
    # contrast = #

    [defaults]
    norm = NTSC
    capture = over
    input = Television

    [CH0 0]
    channel = 0
    fine = 0

    [CH1 1]
    channel = 1
    fine = 0

    [CH2 2]
    channel = 2
    fine = 0

    [CH3 3]
    channel = 3
    fine = 0

    [CH4 4]
    channel = 4
    fine = 0

    [CH5 5]
    channel = 5
    fine = 0

    [CH6 6]
    channel = 6
    fine = 0

    [CH7 7]
    channel = 7
    fine = 0

    [CH8 8]
    channel = 8
    fine = 0

    [CH9 9]
    channel = 9
    fine = 0

    [CH10 10]
    channel = 10
    fine = 0

    [CH11 11]
    channel = 11
    fine = 0

    [CH12 12]
    channel = 12
    fine = 0

    [CH13 13]
    channel = 13
    fine = 0

    [CH14 14]
    channel = 14
    fine = 0

    [CH15 15]
    channel = 15
    fine = 0

    [CH16 16]
    channel = 16
    fine = 0

    [CH17 17]
    channel = 17
    fine = 0

    [CH18 18]
    channel = 18
    fine = 0

    [CH19 19]
    channel = 19
    fine = 0

    [CH20 20]
    channel = 20
    fine = 0

    [CH21 21]
    channel = 21
    fine = 0

    [CH22 22]
    channel = 22
    fine = 0

    [CH23 23]
    channel = 23
    fine = 0

    [CH24 24]
    channel = 24
    fine = 0

    [CH25 25]
    channel = 25
    fine = 0

    [CH26 26]
    channel = 26
    fine = 0

    [CH27 27]
    channel = 27
    fine = 0

    [CH28 28]
    channel = 28
    fine = 0

    [CH29 29]
    channel = 29
    fine = 0

    [CH30 30]
    channel = 30
    fine = 0

    [CH31 31]
    channel = 31
    fine = 0

    [CH32 32]
    channel = 32
    fine = 0

    [CH33 33]
    channel = 33
    fine = 0

    [CH34 34]
    channel = 34
    fine = 0

    [CH35 35]
    channel = 35
    fine = 0

    [CH36 36]
    channel = 36
    fine = 0

    [CH37 37]
    channel = 37
    fine = 0

    [CH38 38]
    channel = 38
    fine = 0

    [CH39 39]
    channel = 39
    fine = 0

    [CH40 40]
    channel = 40
    fine = 0

    [CH41 41]
    channel = 41
    fine = 0

    [CH42 42]
    channel = 42
    fine = 0

    [CH43 43]
    channel = 43
    fine = 0

    [CH44 44]
    channel = 44
    fine = 0

    [CH45 45]
    channel = 45
    fine = 0

    [CH46 46]
    channel = 46
    fine = 0

    [CH47 47]
    channel = 47
    fine = 0

    [CH48 48]
    channel = 48
    fine = 0

    [CH49 49]
    channel = 49
    fine = 0

    [CH50 50]
    channel = 50
    fine = 0

    [CH51 51]
    channel = 51
    fine = 0

    [CH52 52]
    channel = 52
    fine = 0

    [CH53 53]
    channel = 53
    fine = 0

    [CH54 54]
    channel = 54
    fine = 0

    [CH55 55]
    channel = 55
    fine = 0

    [CH56 56]
    channel = 56
    fine = 0

    [CH57 57]
    channel = 57
    fine = 0

    [CH58 58]
    channel = 58
    fine = 0

    [CH59 59]
    channel = 59
    fine = 0

## 3.3 Install the avifile library

Download the latest avifile package from DiVX :-) Homepage. You will need avifile-0.5x and binaries-xxxxxx.zip. You should extract the binaries to /usr/lib/win32. The next section describes compiling and installing avifile-0.53-5.

### Compiling and installing avifile-0.53-5

    # tar xvfz avifile-0.53-5.tar.gz
    # cd avifile-0.53-5
    # ./configure
    # make
    # make install
    # mkdir /usr/lib/win32
    # cd /usr/lib/win32
    # unzip /path/to/binaries-010122.zip

You will need to be root for the make install step to work. If you receive any errors, they were probably due to a missing dependency during the configure step. Resolve any dependencies and try again. This should work smoothly on any recent distribution that was installed with 'development' tools.

## 3.4 Installing the VCR frame-grabber program

You can get the latest vcr program (vcr-1.07 at the time I wrote this) from The VCR Homepage.

### Compiling and installing vcr-1.07

You will need to be root for the make install step to work.

    # tar xvfz vcr-1.07.tar.gz
    # cd vcr-1.07
    # ./configure
    # make
    # make install

### Sample .vcrrc configuration file

By default, vcr installs everything into /usr/local (unless you changed the prefix on the ./configure line). You can now read the man page for vcr with: 'man -M/usr/local/man vcr'. This is where I got the initial .vcrrc file. I configured this one for my needs and added the same presets to this file as I did with the .xawtv file. If you think these files look similar, it's because vcr was originally based on the xawtv code base. Here is the .vcrrc I use: (note that the new 'audiobitrate' parameter means record audio in mp3 format at the specified bitrate. mp3 audio is MUCH! smaller than PCM audio that vcr records by default. 30 minutes = 113 megs for mp3 instead of 240megs for PCM!).

    [defaults]
    quality = 95
    keyframes = 15
    codec = DivX ;-) low-motion
    attributes = BitRate=1600
    source = Television
    norm = ntsc
    verbose = 1
    freqtab = us-cable
    audiofrequency=44
    audiobitrate=64
    resolution=384
    framerate = 29.97
    grabdevice=/dev/video0

    [CH0 0]
    channel = 0
    fine = 0

    [CH1 1]
    channel = 1
    fine = 0

    [CH2 2]
    channel = 2
    fine = 0

    [CH3 3]
    channel = 3
    fine = 0

    [CH4 4]
    channel = 4
    fine = 0

    [CH5 5]
    channel = 5
    fine = 0

    [CH6 6]
    channel = 6
    fine = 0

    [CH7 7]
    channel = 7
    fine = 0

    [CH8 8]
    channel = 8
    fine = 0

    [CH9 9]
    channel = 9
    fine = 0

    [CH10 10]
    channel = 10
    fine = 0

    [CH11 11]
    channel = 11
    fine = 0

    [CH12 12]
    channel = 12
    fine = 0

    [CH13 13]
    channel = 13
    fine = 0

    [CH14 14]
    channel = 14
    fine = 0

    [CH15 15]
    channel = 15
    fine = 0

    [CH16 16]
    channel = 16
    fine = 0

    [CH17 17]
    channel = 17
    fine = 0

    [CH18 18]
    channel = 18
    fine = 0

    [CH19 19]
    channel = 19
    fine = 0

    [CH20 20]
    channel = 20
    fine = 0

    [CH21 21]
    channel = 21
    fine = 0

    [CH22 22]
    channel = 22
    fine = 0

    [CH23 23]
    channel = 23
    fine = 0

    [CH24 24]
    channel = 24
    fine = 0

    [CH25 25]
    channel = 25
    fine = 0

    [CH26 26]
    channel = 26
    fine = 0

    [CH27 27]
    channel = 27
    fine = 0

    [CH28 28]
    channel = 28
    fine = 0

    [CH29 29]
    channel = 29
    fine = 0

    [CH30 30]
    channel = 30
    fine = 0

    [CH31 31]
    channel = 31
    fine = 0

    [CH32 32]
    channel = 32
    fine = 0

    [CH33 33]
    channel = 33
    fine = 0

    [CH34 34]
    channel = 34
    fine = 0

    [CH35 35]
    channel = 35
    fine = 0

    [CH36 36]
    channel = 36
    fine = 0

    [CH37 37]
    channel = 37
    fine = 0

    [CH38 38]
    channel = 38
    fine = 0

    [CH39 39]
    channel = 39
    fine = 0

    [CH40 40]
    channel = 40
    fine = 0

    [CH41 41]
    channel = 41
    fine = 0

    [CH42 42]
    channel = 42
    fine = 0

    [CH43 43]
    channel = 43
    fine = 0

    [CH44 44]
    channel = 44
    fine = 0

    [CH45 45]
    channel = 45
    fine = 0

    [CH46 46]
    channel = 46
    fine = 0

    [CH47 47]
    channel = 47
    fine = 0

    [CH48 48]
    channel = 48
    fine = 0

    [CH49 49]
    channel = 49
    fine = 0

    [CH50 50]
    channel = 50
    fine = 0

    [CH51 51]
    channel = 51
    fine = 0

    [CH52 52]
    channel = 52
    fine = 0

    [CH53 53]
    channel = 53
    fine = 0

    [CH54 54]
    channel = 54
    fine = 0

    [CH55 55]
    channel = 55
    fine = 0

    [CH56 56]
    channel = 56
    fine = 0

    [CH57 57]
    channel = 57
    fine = 0

    [CH58 58]
    channel = 58
    fine = 0

    [CH59 59]
    channel = 59
    fine = 0

## 3.5 Using cron to record your favorite program.

You may want to verify vcr will record your program before setting up cron to record your programs. You can test this by doing "vcr -t 2m test.avi", then try to play back that two-minute sample using aviplay. Note that you will need to add '/usr/local/bin' to your path and '/usr/local/lib' to your ld library path for this to work properly. It was also suggested that you can use 'at' to record your program as well, this may be useful for times when you just want to record a program once at a specific time, but not regularly. Here is a sample shell script that can be called from cron:

### Sample cron shell script

This is a very simple script that merely switches to a channel and records sixty minutes of a program to a date oriented filename. Place this in $HOME/bin of the user who will actually do the recording - since I am going to run it at 6pm, I'll call it recordshow6pm.sh.

    #!/bin/sh
    LD_LIBRARY_PATH=/usr/local/lib
    export LD_LIBRARY_PATH
    PATH=/usr/local/bin:$PATH
    export PATH

    DATE=`date +%m%d%y`
    FILENAME=/path/to/myshow-6pm-$DATE.avi
    v4lctl setstation 3
    vcr -t 60m $FILENAME

### Calling the script from cron

Now it's time to call it from cron, monday through friday at 6pm. To do this, run the crontab -e command as the correct user and enter the following line:

    00 18 * * 1-5 /home/username/bin/recordshow6pm.sh

### Calling the script from at

If you'd rather call the script from at, for one-time execution, you may instead do this:

    at -f /home/username/bin/recordshow6pm.sh 18:00

Next Previous Contents