bttvgrab で MPEG-1


ビデオから取り込んで、動画を MPEG にしようとしたら、今ならどうするのが一番てっとり早いかな?

っていうことになると、やっぱ MS ワールドだろうなぁ。Dazzle Snazzi なんて $250 で投げ売りしてるけど、ReatTime MPEG-1 Encoreder だもんね。

マシンが何台かあって、MPEG 作成用に Windows を寝かしとくってことができるならまぁそれで済む話ではあるよな。だがそれでわ面白くもなんともない、というか予定調和ではないか。というわけで、Linux でなんとか MPEG-1 を作れないか、ということでコンダラ引いてみることにした。

頼れるものっつったらVideo4Linuxくらいか(笑) ぱぱんださんのページのいげろさんのページでいろいろ教わって、どうやら bt848 というチップを載せたキャプチャカードを使えば、bttv ドライバ経由で動画の取り込みができるらしい。これだな。買うしか。

というわけで、bttv のページで最初に動作機種に上げられているHauppauge(だから何て読むんだぁぁぁ!)の WinTV/PCI ってのを買ってきた。

kernel を再構築し、Video4Linux を有効にして、bttv ドライバを module にする。カードを取り付けてリブートするわけなんだけど、あれぇ? 箱を見ると WinTV と確かに書いてあるクセに、肝心のカードの方にはWinCASTって書いてあんぞ。な、中身が違うのぉ? あわてて Hauppauge(だから読めないって)のページに行って確認すると、どうやら中身的にはほとんど同じもんらしい。InterCAST とかなんとかゆ〜 internet 経由で動画を配信する仕組みに対応してる、とかなんとか書いてあった。

interなんとかには全然興味ないが、画像・音声の取り込み能力には違いはないようだったので、だまって取り付けたのだが、同じ製品名称でPCI バスぢゃなかったり FM Radio の Tuner 内蔵だったり、S 端子があったりなかったり… 節操ねぇぞ> Hauppauge(だから読めねぇって < しつこい)

というわけで、なんだかなぁと思いながらも取り付けた(のだがコレが罠だったのだ)。kernel をリブートすると、ちゃんと

Linux video capture interface: v1.00

などと言うぞ。よしよし。

さっそく、xawtvbttvgrabmpeg2vidcodec もコンパイルだ。

xawtv はソースの tar 玉の他に、赤帽用の spec ファイルまで置いてあったので、サクサクとrpm にしてブチ込んだ。これでちゃんと TV のケーブルを接続すれば、Linux で X の上でTV 放送が見られるはずなのだが、コンダラ箱の置いてある場所には TV ケーブルの取り出しがない。まぁ目的はビデオ取り込みなので、ケーブル引っ張るのも面倒だしね。だもんで、Hi8 のカメラを持ってきて、コンポジット、ステレオ左右をカードに接続した。

期待に満ちて xawtv を起動する。と、/dev/video が有効になってないんじゃボケ!などと怒られてしまうでわないか。あれぇ? kernel の構築に失敗したか、make modules_install を忘れたか? などとアセッて調べると、どうもそうじゃないらしい。

どうなっとんぢゃい、と思って bttv-0.6.3.tar.gz を展開して中のドキュメントを読むと、Makefile にその答が。自分で手で MAKEDEV しないとデバイスのスペシャルファイルができないんだってさ(汗) でもこれってヒデェよなぁ。この MAKEDEV そのものは kernel 2.2.1 のソースには含まれてないんだぜ。bttv-0.6.3.tar.gz などの単体で配布されている bttv ドライバのtar 玉を持ってこないと。それってゲンミツには「bttv ドライバは kernel 2.2 以降に含まれている」って言えないんぢゃ…

ちょっとアタマきたが、bttv ドライバ単体でもアップデートされるだろうってのも考慮して kernel を再度構築しなおして、video4linux も bttv ドライバも全部モジュールにし直した。で、bttv-0.6.3.tar.gz の方で make した videodev.o, i2c.o, tuner.o, msp3400.o そして bttv.o に全部差し替えちゃったよ。

で、bttv のドキュメントに従ってモジュールをロードするように /etc/rc.d/rc.local に

echo "Video 4 Linux modules load."
insmod i2c verbose=1 scan=1 i2c_debug=0
insmod tuner debug=0 type=2
insmod msp3400
insmod bttv radio=0 card=2 pll=1

などと書いてやった。オレの Hauppauge のカードは Card ID 2 で FMチューナなしなので上記のようになるらしい。でリブートしてやるとめでたく

i2c: initialized (i2c bus scan enabled)
i2c: driver registered: tuner
i2c: driver registered: msp3400
bttv0: Brooktree Bt848 (rev 18) bus: 0, devfn: 72, irq: 15, memory: 0xe7800000.
bttv: 1 Bt8xx card(s) found.
bttv0: PLL: 28636363 => 35468950 ... ok
bttv0: Hauppauge eeprom: tuner=Philips FI1236 MK2 (2)
bttv0: audio chip: TDA9850
bttv0: model: BT848A(Hauppauge old)
i2c: bus registered: bt848-0
i2c: scanning bus bt848-0: found device at addr=0xa0
i2c: scanning bus bt848-0: found device at addr=0xb6
i2c: scanning bus bt848-0: found device at addr=0xc2
i2c: device attached: tuner (addr=0xc2, bus=bt848-0, driver=tuner)

などと起動時に言うようになった。xawtv を起動すると、ちゃんと Hi8 カメラから取り込んだ映像も X の窓を通して見ることができるでわないか。うむ〜嬉しい。が、ここで問題が(汗)

音声がどうしてもステレオにならないのだ。

のいげろさんのウェブ会議室で質問して教わり、うっすらとわかってきた。オレのカードが WinTV ぢゃなくて、似て非なる WinCAST だってのが問題なようだ。VIDEO 関係はたしかに bt848 なので動作するが、AUDIO 関係のチップが違い、MSP34xx も積んでないし、i2c からコントロールできないらしい。

モノラルだけ通ってくるのは不思議だが、該当するあたりのソースを見てみると、これからステレオちゃんなモードだよ、などとハードをコントロールしている箇所がある。ここで ioctl がエラーを返しちゃってるようだ。要するにそんな機能はないんぢゃコラと言われている(泣)

ブチ切れてカードを引っぺがし、店に叩き返そうかとも思ったのだが… 落ち着いてよく考えると、xawtv を何に使うかってぇと結局はカメラからの映像をスルーで見るだけだ。音声にいたっては腐った WinCAST の Line out からピンケーブルでサウンドカードの Line in にブチ込んでるだけ。

そう。音声をポンコツな WinCAST に渡してやるこたないのだ。最初からサウンドカードの Line in に入れちゃえばいいじゃんねぇ。だがそのためには、赤白のピンジャックから、1本のピンプラグに変換してくれるケーブルが必要だ。たしかあったよなぁ… と、がらくた入れを漁ると出てきた(笑)

非常に不本意かつ情けない形態ではあるが、これで X 上でビデオカメラからの映像・音声をちゃんと見られるようになったワケだ。

いよいよ bttvgrab をインストールして、キャプチャしてみることにする。bttvgrab-0.15.0.tar.gz と mpeg2vidcodec_v12.tar.gz というのをサクサクと make install してみた。

ひょっとして音声を何がなんでも WinCAST の方から取ろうとされちゃうとアウトなのだが、bttvgrab は /dev/dsp から音声を /dev/bttv から画像を取り込んで、それぞれ音声は grab.wav という wav ファイルに、画像はコマンドのオプションによって RGB24 だったり YUV422 だったり pmm という謎なファイル形式だったり、とにかく音声は音声、動画は動画として取り込み、書き出してくれるようだ。はぁよかったぁ。イカスぜ bttvgrab わ。小手調べに

bttvgrab -w 320 -o raw24 -l 100
などとして取り込んでみる。横 320 ピクセル(で縦はデフォルトで 3/4 に)、形式はRGB24 で 100 フレーム取り込んでちょ、という意味だ。他にもたくさんのオプションがあって、n 秒スリープしてから取り込めとか、n フレーム毎に間引いて取り込めとか、あと品質を数値で指定することもできるようだ。デフォルトでは 75 になっていて、最大 100 まで増やせるらしい。

ビデオカメラのほうで再生を開始し、取り込みを開始すると、curses で書かれたインジケータが表示されて、フレーム番号とかフレームレートが出る。おおむね 30 fps (理論値だろうけど)になるのだが、ときどき取りこぼす(笑)

取り込んだ音声の wav ファイルを再生してみると、ちゃんと音が取れていた。はぁよかった。画像のほうは、なんと bttvgrab って指定したフレーム数分のファイルをバラで書き出しているのだった(笑) p_0000.raw24 から p_0099.raw24 までのファイルができているぞ(てことは10000フレームとか取り込んだらどうなるのだろう?)

1つの raw24 ファイルは 230400 バイト、つまり 320 x 240 x 24 / 8 だ。わはは。で、これを今度は bttvconvert で MPEG-1 にしてやる。

bttvconvert -w 320 -o mpeg-1 -i raw24 -l 100 -F grab.wav
画像の入力フォーマットが raw24 で、音声は grab.wav から、100 フレームだけコンバートしてちょ、という意味だ。たくさんオプションがあったが、それらはみんなデフォルトのままにしといた。

コンバートには数分かかるのだが、見事に output.mpg という MPEG-1 なファイルができた…はずなのだが、考えてみると、これを Linux 上で再生する手段がないわ。xanim だと MPEG-1 って音声が出なかったような記憶が。

だもんで、スムーズに再生されるとウワサのMpegTVをダウンロードしてきて、$10 払ってユーザ登録することにした。果たして MpegTV で output.mpg を見てみると…

おぉ!いいじゃんいいじゃん、けっこうマトモかも…

ってな感じのができてたぜ。

ちょっと試しに見てみてよ。trx001.mpgてのを置いといたから。1.2Mもあるんだけど(笑) 映像は 320 x 240 の RGB24 で、音声は 44 KHz の 16bit stereo で取り込んだのを MPEG-1 にしてみたもの。200 フレームある。

内容はというと… YAMAHA TRX850 でコーナーを抜けていくオレだったりする(笑)


メール 戻る