2005年09月19日(月)
■[tips]Linuxでもdivxでハードウエアキャプチャ(ユーザーガイド編)
8/3以来、ウチではLinuxとPLEXTOR USB TVキャプチャBOX PX-TV402U/JPの組み合わせで、divxでTV録画を行なってきた。6件/Day程度の予約録画を二週間続けて失敗しなくなったので、ほぼ問題を潰し尽した、と判断し、8/3の日記で予告したようにユーザガイドを試みることにする。
ハードウエア入手も、導入も、兄貴分のmpeg2ハードウエアキャプチャドライバ IVTVより容易であり、また、ウチの環境では、ivtvよりも安定している。
なお、以下の話は debian を前提にしている。
- Plexter PX-TV402Uの概略
- 既知の制限・留意事項・問題
- 準備
# MAKEFLAGS="CC=gcc-3.3" make-kpkg --revision=Video.0.0 kernel-image modules-image # MAKEFLAGS="CC=gcc-3.3" make KERNELSRC=/usr/src/linux-2.6.11.12
- gorecordmodのコンパイルとインストール
上述したように、同梱の録画アプリ gorecordは音ズレ等の問題があり利用には適さない
mythtv version 0.18.1以降は go7007 対応なのでそちらを使う手もあるが、大仕掛けなソフトであり一発で動かないと大変なので推奨しない20051108の日記で、go7007Bでmythtv稼動をレポートした
ここではお手軽な gorecordmod を推奨- インスコ手順
- ソースの展開ここより、最新版の gorecrodmodを入手して、格納されているファイルを、go7007ソースを展開したディレクトリに gorecordmod5 とかいうディレクトリを適当に切って展開
つまり go7007 のREADME と gorecordmod が同じレベルにある、ということ - 最低でも README と、gorecordmod.c と Makefile くらいには、さっと目を通す
- 32bit整数上限への対応
このままコンパイルすると File size limit exceeded というメッセージと伴に 2147483647 バイトで録画が中断される
対策として Makefiel 中の gcc のオプションに -D_FILE_OFFSET_BITS=64を追加しておく - あとは、make でコンパイルして、パスの通った場所に実行フラグを付けてgorecordmod を設置すればおしまい
- 動作確認
PX-TV402Uを接続した状態↓のようにしてちゃんと録画されたら成功
使い方は gorecordmod -h で表示されるが、ソースを読んだ方がいい
- ソースの展開ここより、最新版の gorecrodmodを入手して、格納されているファイルを、go7007ソースを展開したディレクトリに gorecordmod5 とかいうディレクトリを適当に切って展開
- インスコ手順
$ gorecordmod -frames 300 -mode ntsc-j -tvchan ntsc-bcast-jp:1 -input 2 test.avi
- gorecordmodの注意点
- ivtvと共存出来ない
ivtvと共存させると、gorecordmod は音が絶えず小刻みに変調するようになる(音楽以外では、気にならない程度である)
また、とても不安定になる - 仮数桁数の多い録画ビットレート指定
-bitrate 3333 のようにビットレート指定の仮数部桁数が多いと、録画結果が異常になり、その後にシステムをクラッシュさせる
仮数部は2ケタ迄(ex. -bitrate 3300)にとどめるのが安全 - durationsオプション
バグのため durationオプションが効かない
だから -frames (録画秒数)×29.97としなくちゃいけない - 音声モード指定(-tvaudio)で stereo 以外を指定するとコケる
- ivtvと共存出来ない
phpは素人なんで、人にみせれるようなものではないが、以下御参考までに、record.php の録画を行なっている所を抜粋
$OUTDIR = "spool";
$FRAMES = $SECOND * 29.97;
if($CH=="S"){
$COMMAND= "/home/amt/bin/gorecordmod5 -input 1 -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o spool/".$OUTPUT.".avi > /dev/null && nice -n 19 rm spool/".$OUTPUT."_PCM.avi > /dev/null";
}else if($CH=="C") {
$COMMAND= "/home/amt/bin/gorecordmod5 -input 0 -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o spool/".$OUTPUT.".avi > /dev/null && nice -n 19 rm spool/".$OUTPUT."_PCM.avi > /dev/null";
}else if($CH=="X") {
//試験用 S端子入力録画結果を消さない
$COMMAND= "/home/amt/bin/gorecordmod5 -input 0 -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o spool/".$OUTPUT.".avi > /dev/null";
}else if($CH<=12) {
// $COMMAND= "/home/amt/bin/gorecordmod5 -input 2 -mode ntsc-j -tvchan ntsc-bcast-jp:".$CH." -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp2:abitrate=320 -o spool/".$OUTPUT.".avi > /dev/null && nice -n 19 rm spool/".$OUTPUT."_PCM.avi > /dev/null";
$COMMAND= "/home/amt/bin/gorecordmod5 -input 2 -mode ntsc-j -tvchan ntsc-bcast-jp:".$CH." -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o spool/".$OUTPUT.".avi > /dev/null && nice -n 19 rm spool/".$OUTPUT."_PCM.avi > /dev/null";
}else {
$COMMAND= "/home/amt/bin/gorecordmod5 -input 2 -mode ntsc-j -tvchan ntsc-cable-jp:".$CH." -frames ".($SECOND*29.97)." -bitrate ".$BITRATE[$QT]." -width ".$WIDTH[$DS]." -height ".$HEIGHT[$DS]." spool/".$OUTPUT."_PCM.avi > /dev/null && nice -n 19 mencoder -quiet spool/".$OUTPUT."_PCM.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o spool/".$OUTPUT.".avi > /dev/null && nice -n 19 rm spool/".$OUTPUT."_PCM.avi > /dev/null";
}
- 筐体を空けてみた
Gorecordmod は ビットレート10Mbpsまで指定できるのに 熱の問題のために 4Mbps でも時折ブロックノイズがまじるのはなんとも悔しい。本機の真価を発揮させるために、冷却方法を検討すべく筐体を開けてみた。

- 音声再エンコード
- 本機はハードウエアで音声を圧縮しないので、そのままだと 音声だけで1.5Mbpsもあり邪魔
性能に余裕があれば、オーディオの再エンコードを是非行なうべきである
再エンコードには、メモリはほとんど食われない、CPU時間 だけを気にすればよい - HARDWARE go7007 - Gentoo Linux Wikiには、mp3lame で再エンコードすると、音声画像同期で問題が発生するように書いてあるが、これは gorecordの問題のことを誤認しているものと思われる。ウチで↓のように 音声画像同期問題対策版 gorecordmod で録画したソースに対して mp3lame とlavc との両方を試した結果はどちらも、音声画像同期に乱れはなかった。
- 本機はハードウエアで音声を圧縮しないので、そのままだと 音声だけで1.5Mbpsもあり邪魔
$ mencoder 4M.avi -ovc copy -oac mp3lame -o lame.avi $ mencoder 4M.avi -ovc copy -oac lavc -lavcopts acodec=mp3:abitrate=128 -o lavc.avi
- 他サウンドカードと干渉する問題
- 現象
- alsa を使っていて、go7007bデバイスを付けると、正しく /etc/modprobe.d/soundに複数カードの設定を行なっても、このカードがいつも、card0 を専有して、他のサウンドカードが一切認識されない。
- 推定原因
- snd-go7007のお行儀が悪いんじゃないかと思うが、タコなので深くは追求していない。↓に示す応急処置も力ずくのものである。
- 応急処置
- /etc/rc.bootにでも↓のような内容のスクリプトファイルを置いておく。
chmod +x を忘れずに。
#!/bin/sh # reset sound module against malfanction of go7007 echo "++++++++++++++++++reset sound++++++++++++++++++++++++++" modprobe -r go7007-usb;/etc/init.d/alsa reload;/etc/init.d/hotplug restart
options snd-usb-audio index=-2 vid=0x093b pid=0xa104
- 20051107追記 PX-TV402U/JP 二代目を購入
何も考えずに、一代目を接続しているマシンに繋いでリブートすると↓のようになった。
$ cat /proc/asound/ound/cards
0 [V8237 ]: VIA8237 - VIA 8237
VIA 8237 with AD1888 at 0xe400, irq 22
1 [PXTV402 ]: go7007 - Plextor PX-TV402
Plextor PX-TV402
2 [PXTV402_1 ]: go7007 - Plextor PX-TV402
Plextor PX-TV402
この状態では次のようになる
/dev/dsp0 -> VIA 8237
/dev/dsp1 -> PXVT401 1台目
/dev/dsp2 -> PXVT401 2台目
/dev/video0 -> PXVT401 1台目
/dev/video1 -> PXVT401 2台目
つまり gorecodemodで 二代目に録画するときは↓のようにする
$ gorecordmod5 -input 2 -mode ntsc-j -tvchan ntsc-bcast-jp:3 -frames 300 -bitrate 4000 -vdevice /dev/video1 -adevice /dev/dsp2 test2.avi
ネットワークデバイスとかとちがって、カーネルからみて、1台目と2代目の区別が全くつかないのが頭の痛い所だ。
- 今後の課題
- キャプチャ出力例
冷却を十分に行なって本機 で 10Mpbs で録画した映像
地上波録画としては完璧な画質だと思う。
ビットレート10Mbpsを指定したが、国会中継は6Mbps程度で飽和している感じ
余談だが、報道番組なんて画質は重要じゃないとか思ったが、小泉の肚のウチを探ろう、とか思ったら、これくらいのクオリティがいる、ということを痛感。

↓同じ画像でなくて恐縮だが、参考までに ivtv なITVC15-STVPCI で 14Mbps MPEG2でキャプチャした画像。これをみるまでもなくウチでは ivtv は退役。カード三枚余ってるんだけどだれか買ってくれないかな。

チップが加熱すると、↓のようなブロックノイズの入った画面がまざり音が乱れる

更にひどくなると↓のようなエラーメッセージが延々と出て
Marker bit missing before vop_coded
[mpeg4 @ 0xb64b8998]ac-tex damaged at 28 8
[mpeg4 @ 0xb64b8998]Error at MB: 356
[mpeg4 @ 0xb64b8998]concealing errors
[mpeg4 @ 0xb64b8998]1. marker bit missing in 3. esc
[mpeg4 @ 0xb64b8998]Error at MB: 87
[mpeg4 @ 0xb64b8998]concealing errors
↓のような画面となる。

- 参考
- WIS Technologies Open Source Software
go7007bドライバ配布元 - HARDWARE go7007 - Gentoo Linux Wiki
- Forums
小生の知る限り、現在go7007に関する議論が行なわれている唯一の場所 - Linux users: gorecord mod for previewing. - Topic Powered by Groupee Community
音ズレ対策済みかつ、録画と同時に視聴可能なgorecordmod配布元 - メディアサーバ珍道中PCI版のpx-tv432pで作業されている方のblog です。
僕も動けばこっちが本命だと思いますマザボから電源取ってファン付きチップクーラで 10Mbpsキャプチャも楽々でしょう。 - sushi-k 日誌白箱で作業されている方のblog
玄箱とか白箱の本の著者でいらっしゃいます - VRSPHPで実装されたシンプルなビデオ録画フロントエンド
- なすさんのLinkStation+VINEでの動作報告
この方(資料・調査編)の方にコメントを頂戴しておりますが、ググっても詳細を発見できず - go7007でもmythtv
- WIS Technologies Open Source Software
- 255 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-08,GGLD:ja&q=Caprio+R3
- 157 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP:official_s&q=mega+x+key++自作 usb&btnG=Google+検索&lr=
- 106 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=DVD+PCM+mpeg2+音声のみ&num=50
- 98 http://www.google.co.jp/search?q=XBOX+LINUX&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 76 http://www.google.co.jp/search?q=Linux+キャプチャ&hl=ja&lr=&rls=GGLD,GGLD:2003-48,GGLD:ja&start=20&sa=N
- 70 http://www.google.co.jp/search?q=xbox+linux&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:official&client=firefox
- 61 http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla:ja:official&q=/etc/rc.boot+debian+玄箱&btnG=Google+検索&lr=lang_ja
- 60 http://www.google.co.jp/url?sa=t&rct=j&q=xbox linux&source=web&cd=1&ved=0CC4QFjAA&url=http://d.hatena.ne.jp/amt/20050919/Xbox&ei=T3ilTqSmIaX_mAW7wKCgCQ&usg=AFQjCNGWSi0hxEToCPJiTlVz5BSyOugwgw&sig2=ANL3IIzzQYSnJVHFx-cy9Q
- 59 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rls=DVXA,DVXA:2006-18,DVXA:ja&q=おもてなしの空間+plextor
- 58 http://72.14.235.104/search?q=cache:v4AlqHg-E84J:d.hatena.ne.jp/amt/20050919/go7007bUserGuide+玄箱 キャプチャ&hl=ja&gl=jp&ct=clnk&cd=5&lr=lang_ja




