CentOS 5 で Buffalo PC-MV31XR/PCI を使う

以前、似たようなことを書いたのですが間違いでしたので削除しました。

ということでやりなおしです。Buffalo PC-MV31XR/PCICentOS 5 で使う方法です。

kernel の SRPM パッケージを取得

centosplus の kernel SRPM パッケージをダウンロードします。

$ lftp ftp.iij.ad.jp:/pub/linux/centos/5.2/centosplus/SRPMS/kernel-2.6.18-92.1.6.el5.centos.plus.src.rpm

カーネルパッチを取得

Linuxでテレビを見る のパッチが利用できます。Vine Linux 4.x のカーネルパッチから自分でパッチを作成する場合、upd64031a.c, upd64083.c, wm8739.c の差分を削除し、数ヶ所手直しする感じになるようです。

RPM を作成

下記のようにRPM のビルド環境が作ってあると仮定します。

$ echo "%_topdir /home/user/.rpm/" > .rpmmacros
$ mkdir .rpm/{RPMS,SRPMS,SPECS,BUILD,SOURCES}

rpm-build のRPMパッケージがインストールされていなければインストールします。

$ sudo yum install rpm-build

kernelのSRPMパッケージを展開します。

$ rpm -ivh kernel-2.6.18-92.1.6.el5.centos.plus.src.rpm

SPECファイルを変更します。~/.rpm/SPECS/kernel-2.6.spec を下記のように変更しました。

  • 74行目: %define release 行の 92.1.6 を 92.1.7 に変更
  • 2364行目あたり: 下記を追加
Patch22569: linux-2.6.18-saa7133gyc-stvlp_ivtv.patch
  • 4686行目あたり: 下記を追加
%patch22569 -p1

パッチを .rpm/SOURCES 以下に置いてビルドします。

$ rpmbuild --without xen --without pae --without smp --without kdump --with
out debuginfo  --target=i686 --clean -ba .rpm/SPECS/kernel-2.6.spec

インストール

$ sudo rpm -ivh .rpm/RPMS/i686/kernel-2.6.18-92.1.7.el5.centos.plus.i686.rpm

再起動してください。

カーネルモジュールの組込み

手元の環境ではカーネル起動時にカーネルモジュールのロードは行われましたがカードの自動認識に失敗しました。手動で認識させます。

$ sudo /sbin/rmmod saa7134
$ sudo /sbin/modprobe upd64083
$ sudo /sbin/modprobe upd64031a
$ sudo /sbin/modprobe saa7134 card=97

起動のたびに手動でカーネルモジュールのロードをやるのは手間がかかるので /etc/modprobe.d/video というファイルを作って以下のように書きました。

$ cat /etc/modprobe.d/video 
### for saa7134
options saa7134 card=97
install saa7134 /sbin/modprobe upd64083; /sbin/modprobe upd64031a; /sbin/modprobe --ignore-install saa7134
remove saa7134 /sbin/modprobe -r --ignore-remove saa7134 && /sbin/modprobe -r upd64083 && /sbin/modprobe -r upd64031a

再生する

mplayer, tvtime などで再生してみてください。mplayer の場合は例えば以下のようにするようです。

$ mplayer tv://9 -tv driver=v4l2:chanlist=japan-bcast:norm=NTSC:alsa:volume=100:width=640:height=480 -vf pp=lb

録画する

mplayer に付いている mencoder を使い、下記のスクリプトを用意して録画しています。

$ cat rec.sh
#!/bin/sh

if [ $# != 2 ]; then
    echo please specify channel and length
    exit
fi

channel=$1
length=$2

filename=`date +%Y%m%d%H%M`${channel}.avi

mencoder \
tv://$channel \
 -tv driver=v4l2:chanlist=japan-bcast:norm=NTSC:alsa:volume=100 \
 -tv width=640:height=480:audiorate=48000:amode=1 \
 -oac mp3lame -lameopts cbr:br=128 \
 -ovc lavc \
 -lavcopts vcodec=mpeg4:vqscale=4:aspect=4/3 \
 -fps 29.97 \
 -ofps 29.97 \
 -vop denoise3d=20:20:8 \
 -vf pp=lb \
 -o  $filename \
 -endpos $length

オプションについては man に書かれています。

  • amode=1 と指定しない場合、2カ国語放送の主音声と副音声が混ざって記録されます。
  • audiorate=48000, -ofps 29.97 は音ずれ防止対策です。
  • vqscale は MPEG4 エンコーダの品質を指定します。値が小さい程高品質となります。vqscale=4 で1時間あたり大体1.1GBです。
  • denoise3d=20:20:8 でノイズを低減しています。数値は最初の2つが空間的、最後の1つが時間的なフィルタの強さです。空間方向に強めすぎるとぼけた映像になります。時間方向に強めすぎると激しい映像の変化時に残像が残るようになります。
  • pp=lb でインターレースを解除しています。

9チャンネルを60分(=3600秒)録画する場合は以下のように実行します。

$ ./rec.sh 9 3600

録画を開始した年月日時分秒がファイル名として利用されます。例えば、2008/7/29 0:05:30 に上記スクリプトを利用して録画を開始した場合 20080729000530.avi というファイルが作成されます。

音声が録音されない場合

このキャプチャカードはサウンドカードのLine入力経由で音を再生します。Line 入力からの音声を録音するように設定します。

まず、録音可能なサウンドカードの一覧を表示します。

$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: V8235 [VIA 8235], デバイス 0: VIA 8235 [VIA 8235]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: V8235 [VIA 8235], デバイス 1: VIA 8235 [VIA 8235]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: radioSHARK [radioSHARK], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

サウンドカードの番号が 0 番だとわかります。このサウンドカードで設定可能な項目の一覧を表示します。

$ amixer -c 0 contents
(略)
numid=26,iface=MIXER,name='Capture Source'
  ; type=ENUMERATED,access=rw------,values=2,items=8
  ; Item #0 'Mic'
  ; Item #1 'CD'
  ; Item #2 'Video'
  ; Item #3 'Aux'
  ; Item #4 'Line'
  ; Item #5 'Mix'
  ; Item #6 'Mix Mono'
  ; Item #7 'Phone'
  : values=0,0
numid=27,iface=MIXER,name='Capture Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=on,on
numid=28,iface=MIXER,name='Capture Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=15,step=0
  : values=9,9
  | dBscale-min=0.00dB,step=1.50dB,mute=0
(略)

上記の場合にLine入力を録音するようにするには、下記のようにすると良いようです。音量はいい加減です。

$ amixer -c 0 cset iface=MIXER,name='Capture Source' 4
numid=26,iface=MIXER,name='Capture Source'
  ; type=ENUMERATED,access=rw------,values=2,items=8
  ; Item #0 'Mic'
  ; Item #1 'CD'
  ; Item #2 'Video'
  ; Item #3 'Aux'
  ; Item #4 'Line'
  ; Item #5 'Mix'
  ; Item #6 'Mix Mono'
  ; Item #7 'Phone'
  : values=4,4
$ amixer -c 0 cset iface=MIXER,name='Capture Switch' on
numid=27,iface=MIXER,name='Capture Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=on,on
$ amixer -c 0 cset iface=MIXER,name='Capture Volume' 9