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