[Index] [TitleIndex] [WordIndex

Multiple BTTV TV Cards

This is what I did to add a secondary tuner for recording, keeping the main tuner free for live tv viewing. Someone that knows Freevo better than I do should probably write this part, but something better than nothing right? 4 hours experience with Freevo and counting (version 1.5.2).

In the local_conf.py file there are to variables VCR_CMD and VCR_AUDIO that tells mencoder everything it needs to know about recording by pulling together several of the variables defined earlier in the file, or in freevo.conf.

It uses:

CONF.mencoder (freevo.conf)
CONF.tv (freevo.conf)
CONF.chanlist (freevo.conf)

TV_DRIVER = 'v4l2'
TV_DEVICE = '/dev/video0'
TV_INPUT  = '0'
AUDIO_DEVICE = ='/dev/dsp'

What I did was create duplicates of these variables to reflect the hardware device I wanted to use for recording.

Added:

TV_DRIVER_2 = 'v4l2'
TV_DEVICE_2 = '/dev/video1'
TV_INPUT_2  = '0'
AUDIO_DEVICE_2 = '/dev/dsp1'

The CONF.x variables I left alone, since they would be the same for each tuner.

After adding the variables, find the VCR_AUDIO variable and change AUDIO_DEVICE to AUDIO_DEVICE_2 to use the second sound source.

VCR_AUDIO = (':adevice=%s' % AUDIO_DEVICE_2 +
              ':audiorate=32000' +         # 44100 for better sound
              ':forceaudio:forcechan=1:' + # Forced mono for bug in my driver
              'buffersize=64')             # 64MB capture buffer, change?

Now modify the VCR_CMD variable to use the _2 variables instead of the main. For my card I had to add the normid=1 part to select NTSC. See the mencoder pages for more info.

VCR_CMD = (CONF.mencoder + ' ' +
            'tv:// ' +                      # New mplayer requires this.
            '-tv driver=%s:input=%d' % (TV_DRIVER_2, TV_INPUT_2) +
            ':norm=%s' % CONF.tv +
            ':normid=1' +                   # I had to add this to make it work for my card
            ':channel=%(channel)s' +        # Filled in by Freevo
            ':chanlist=%s' % CONF.chanlist +
            ':width=%d:height=%d' % (TV_REC_SIZE[0], TV_REC_SIZE[1]) +
            ':outfmt=%s' % TV_REC_OUTFMT +
            ':device=%s' % TV_DEVICE_2 +
            VCR_AUDIO +                     # set above
            ' -ovc lavc -lavcopts ' +       # Mencoder lavcodec video codec
            'vcodec=mpeg4' +                # lavcodec mpeg-4
            ':vbitrate=1200:' +             # Change lower/higher, bitrate
            'keyint=30 ' +                  # Keyframe every 10 secs, change?
            '-oac mp3lame -lameopts ' +     # Use Lame for MP3 encoding, must be enabled in mencoder!
            'br=128:cbr:mode=3 ' +          # MP3 const. bitrate, 128 kbit/s
            '-ffourcc divx ' +              # Force 'divx' ident, better compat.
            '-endpos %(seconds)s ' +        # only mencoder uses this so do it here.
            '-o %(filename)s')              # Filled in by Freevo

One catch to this is the need to adjust mixer levels on the second sound card manually. In my case this meant running

'alsamixer -c 1', setting the line-in volume up, muting it, and setting it for capture.

If it doesn't work for you, add a print line for the VCR_CMD "print VCR_CMD" to the end of local_conf.py for testing. Run freevo and make note of the output for VCR_CMD. Change '%(channel)s', %(seconds)s, and %(filename) to something appropriate(such as 3, 10, and test.avi) and try running the command manually to find the reason it isn't working.

Finally, the recordserver script puts a drop file to prevent live tv viewing / channel changes during record. I couldn't see a way to disable this with an option, so I did it by patching the recordserver.py file.

Locate the line:

tv_lock_file = config.FREEVO_CACHEDIR + '/record'

Change this line to:

tv_lock_file = config.FREEVO_CACHEDIR + '/record.tuner2'

If anyone else has a cleaner way to do this, for the love of god and all that is holy write it up and put it here!

Multiple IVTV Cards

I happen to have a pair of Hauppauge WinTV PVR 150 MCE cards in my system. I found that setting up multiple IVTV cards requires extra recording groups to be created and very little else. In local_conf.py, the suggested settings are:

VIDEO_GROUPS = [
     # Use this group for watching tv
     VideoGroup(vdev=TV_VIEW_DEVICE,                # In my case, /dev/video1
                adev=TV_VEIW_AUDIO_DEVICE,          # Set to None for Hauppauge PVR cards
                input_type='tuner',
                tuner_norm=CONF.tv,
                tuner_chanlist=CONF.chanlist,
                desc='Watching Video Group',
                group_type='ivtv',
                record_group=1),
     # Use this group for recording tv
     VideoGroup(vdev=TV_RECORD_DEVICE,              # In my case, /dev/video0
                adev=TV_RECORD_AUDIO_DEVICE,        # Again, set to None for Hauppauge PVR cards
                input_type='tuner',
                tuner_norm=CONF.tv,
                tuner_chanlist=CONF.chanlist,
                desc='Recording Video Group',
                group_type='ivtv',
                record_group=None)
]

Most, if not all, of the Hauppauge PVR cards have additional inputs which can also be configured as viewable and recordable inputs. I got these working by setting up the following:

VIDEO_GROUPS = [
        VideoGroup(
                vdev='/dev/video1',
                adev=None,
                input_type='tuner',
                input_num=0,
                tuner_norm='NTSC',
                tuner_chanlist='us-cable',
                desc='Local Cable',
                group_type='ivtv',
                record_group=1),
        VideoGroup(
                vdev='/dev/video0',
                adev=None,
                input_type='tuner',
                input_num=0,
                tuner_norm='NTSC',
                tuner_chanlist='us-cable',
                desc='Local Cable Recording',
                group_type='ivtv',
                record_group=None),
        VideoGroup(
                vdev='/dev/video1',                # Composite input on /dev/video1
                adev=None,                         # for viewing only.
                input_type='composite',
                input_num=2,
                tuner_type='external',
                desc='Composite Input',
                group_type='ivtv',
                record_group=3),
        VideoGroup(
                vdev='/dev/video0',                # Composite input on /dev/video0
                adev=None,                         # for recording only.
                input_type='composite',
                input_num=2,
                tuner_type='external',
                desc='Composite Input Recording',
                group_type='ivtv',
                record_group=None),
        VideoGroup(
                vdev='/dev/video1',                # S-Video input on /dev/video1
                adev=None,                         # for viewing only.
                input_type='svideo',
                input_num=1,
                tuner_type='external',
                desc='S-Video Input',
                group_type='ivtv',
                record_group=5),
        VideoGroup(
                vdev='/dev/video0',                # S-Video input on /dev/video0
                adev=None,                         # for recording only.
                input_type='svideo',
                input_num=1,
                tuner_type='external',
                desc='S-Video Input Recording',
                group_type='ivtv',
                record_group=None)
]

Because I use ivtv_record and ivtv_xine_tv, there isn't much else to configure.


2014-02-15 05:10