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)。
 | 此脚本(以及来自您的 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
|