D. 使用 Bttv 录制视频和声音

除了第 5 节中引用的应用程序外,还可以从命令行管理录制。此处讨论的关于声音捕获的问题仅涉及默认的 kernel-2.6 及更高版本的声音系统:高级 Linux 声音架构

简单的部分是抓取视频,为此我们将使用 streamer,它随 Xawtv 套件提供。然而,声音是另一回事。您将需要使用 amixer 访问您的混音器设置,amixer 是 ALSA 命令行混音器,它应该在您的 Linux 发行版提供的 ALSA-tools 包中可用。请参阅 man amixer 以了解命令行选项。

您的录制可以通过以下方式管理:如果您将 Bt8x8 音频输出连接到允许捕获的混音器通道(例如,4 针模拟 CDROM 输入插槽),则使用您的主声卡;或者使用 btaudio 模块使用 Bt8x8 卡本身。以下步骤利用后者。首先,识别系统上的各个声卡(需要/proc文件系统)

   $ cat /proc/asound/pcm
   00-00: Intel ICH : NVidia CK8S : playback 1 : capture 1
   00-01: Intel ICH - MIC ADC : NVidia CK8S - MIC ADC : capture 1
   00-02: Intel ICH - IEC958 : NVidia CK8S - IEC958 : playback 1
   01-00: Bt87x Digital : Bt87x Digital : capture 1
   01-01: Bt87x Analog : Bt87x Analog : capture 1
第一列指示您的可用声音设备的系统编号,即,声卡 0 是声卡,卡 01 或 1 是 Bt8x8。

接下来,识别 Bt8x8 卡的混音器控件。

   $ amixer -c 1 controls
   numid=3,iface=MIXER,name='Capture Source'
   numid=2,iface=MIXER,name='Capture Boost'
   numid=1,iface=MIXER,name='Capture Volume'
然后识别每个项目的设置
   $ amixer -c 1 cget name='Capture Source'
   numid=3,iface=MIXER,name='Capture Source'
   ; type=ENUMERATED,access=rw---,values=1,items=3
   ; Item #0 'TV Tuner'
   ; Item #1 'FM'
   ; Item #2 'Mic/Line'
   : values=1

   $ amixer -c 1 cget name='Capture Boost'
   numid=2,iface=MIXER,name='Capture Boost'
   ; type=BOOLEAN,access=rw---,values=1
   values=on

   $ amixer -c 1 cget name='Capture Volume'
   numid=1,iface=MIXER,name='Capture Volume'
   ; type=INTEGER,access=rw---,values=1,min=0,max=15,step=0
   : values=0
使用 cset 设置捕获源
   $ amixer -c 1 cset name='Capture Source' 0
...以及设置音量
   $ amixer -c 1 cset name="Capture Volume' 15
...您应该准备好了。

现在尝试录制一些内容

   $ streamer -p 4 -t 1:00 -r 24 -q -o test.avi -j 90 -f mjpeg -F mono16
...您应该正在录制一个启用声音的 avi 文件。按 [Ctrl]-C 提前取消。下一步是为您的自制 Tivo™ 自动化录制!

我提供以下脚本作为自动化录制的示例程序;您可以将其复制并粘贴到一个文件中并使其可执行 (chmod u+x record-tv.sh)。

Warning

此脚本(以及来自您的 Bttv 设备的任何录制)会生成非常大的文件,每小时大约几个 GB,因此请确保您有大量的可用磁盘空间。

 #!/bin/bash 
 # ================= record-tv.sh  ============================
 # = copyright 2003 by Greg Watson  gwatsonATlinuxlogin.com   =
 # = GPL2 License, minor modifications by Howard Shane        =
 # = hshaneATaustin.rr.com , under same license               =
 # = usage record-tv.sh prefix-filename record-time channel   =
 # = Example:  ./record-tv.sh enterprise 61:00 20             =
 # ============================================================
 # Version 0.9
 # Last Mod: Wed Feb 20 11:27 CST 2005

 # Output directory
 OUTPUT=$HOME/vcr
 # Streamer location
 STREAMER=/usr/bin/streamer
 # Alsa Mixer
 AMIXER=/usr/bin/amixer
 # v4lctl path
 V4LCTL=/usr/bin/v4lctl
 # Capture Volume to ensure sound is recorded (80%)
 CAPTURE_VOLUME=100

 # Tvtime settings file for color/brightness/contrast values
 TVTIME=$HOME/.tvtime/tvtime.xml

 # End of Config
 ###############

 # check if I'm running TV, if so just exit
 if [ `ps -C tvtime | grep -c tvtime` -gt 0 ]; then
         echo "TVtime is running, aborting recording."
         exit
 fi
 
 # If the filename prefix wasn't given, set it to 'recording'
 if [ -z $1 ]; then
         PREFIX="recording"
 else
         PREFIX=$1
 fi
 
 # if time is blank, record for 30 minutes
 if [ -z $2 ]; then
         TIME="30:00"
 else
         TIME=$2
 fi
 
 if [ ! -z $3 ]; then
         $V4LCTL setchannel $3
 fi
 
 # Check for vcr dir
 if [ ! -x $OUTPUT ]; then
         mkdir $OUTPUT
 fi
         
 DATE=`date +%m-%d-%Y-%H:%M`
 
 # Set the AC97 volume to 0 (so we don't hear the sounds)
 # Get mixer values first
 PLAY_VOL=`$AMIXER -c 0 cget name='Master Playback Volume' | grep : | sed 's/^.*=\([^,]*\).*$/\1/'`
 CAP_VOL=`$AMIXER -c 0 cget name='PCM Playback Volume' | grep : | sed 's/^.*=\([^,]*\).*$/\1/'`
 #  
 $AMIXER -c 0 -q cset name='CD Playback Volume' 100
 $AMIXER -c 0 -q cset name='Capture Volume' 1
 
 # if tvtime.xml is set, then grab settings out of it
 if [ -f $TVTIME ]; then
         CONTRAST=`cat ${TVTIME} | grep DefaultContrast | sed 's/^.*value="\([^"]*\).*$/\1/'`
         BRIGHTNESS=`cat ${TVTIME} | grep DefaultBrightness | sed 's/^.*value="\([^"]*\).*$/\1/'`
         COLOR=`cat ${TVTIME} | grep DefaultColour | sed 's/^.*value="\([^"]*\).*$/\1/'`
         HUE=`cat ${TVTIME} | grep DefaultHue | sed 's/^.*value="\([^"]*\).*$/\1/'`
 
         $V4LCTL bright ${BRIGHTNESS}% color ${COLOR}% contrast ${CONTRAST}% hue ${HUE}%
 fi
 
 $STREAMER -p 4 -q -t ${TIME} -r 24 -q -o ${OUTPUT}/${PREFIX}-${DATE}-${TIME}.avi -j 90 -f mjpeg -F mono16
 
 # Sometimes streamer doesn't always re-mute audio, mute it again just to be sure
 $V4LCTL volume mute on
 
 # Restore volumes
 $AMIXER -q cset name='Master Playback Volume' $PLAY_VOL
 $AMIXER -q cset name='PCM Playback Volume' $CAP_VOL
 #
 # EOF