linuxでHDV 1080iをキャプチャする

HDR-HC1を買ったついでに、うちのlinux(FC4なデスクトップ)でHDV 1080iのキャプチャにチャレンジです。
実は事前に検討はついていて

MicroMV capture
http://www.kinodv.org/article/view/54/1/11

に、mpeg over 1394なストリームをキャプチャするための小さなプログラムmpg1394grabというのがあます。
これは文中ではソニーのMicroMV用ってことになってますが、規格的にはHDV 1080iでも使えるはず!ということで試したところ、無事うまくいきました。

mpg1394grabのインストール

mpg1394grab.cをとってきてコンパイルし、パスの通ったところにインストールします。
FC4的にはパッケージlibraw1394-develが必要です。
コンパイルは、ファイル中にあるとおり
$ gcc -lraw1394 -o mpg1394grab mpg1394grab.c -D_FILE_OFFSET_BITS=64とします。
インストールは
$ install mpg1394grab ~/bin/と、$HOME/binにおいときましょう。

/dev/raw1394の確認

デバイスファイルを確認しましょう。
/dev/raw1394が存在するか?また、権限があるかを確認してください。
ウチのFC4では、
crw-rw---- 1 root root 171, 0 Jul 23 17:02 /dev/raw/raw1394という構成になっていたので
# cd /dev
# ln -fs raw/raw1394 raw1394
# chmod 666 raw/raw1394
と、シンボリックリンクを作成し、権限を修正しました。
# この権限の修正はやや乱暴です。使用しているユーザーをrootグループに入れる方が少しだけマシです

キャプチャの実行

キャプチャは簡単です。
ビデオをIEEE1394接続し、電源を入れ、再生モードにしたら
$ mpg1394grab > test.m2tとして、test.m2tというファイルにmpeg2tsを保存開始します。
PC側でコマンド実行後にビデオ側の再生ボタンを押してOKです。
CTRL+Cでおもむろに停止してもいいですが、ビデオ側で停止すれば、停止した時点でmpeg2tsストリームは流れませんから、ファイルもそれ以上大きくなりません。CTRL+Cで停止するのはそのあとでOKです。

再生するには?

mplayerやvlcは、mpeg2tsに対応しているので、本来はそのまま再生できます。
が、しかし、Windows XPが動いている別のマシンで再生するとちゃんと再生できるのですが、なぜかFC4のmplayerやvlcで再生しようとすると固まります^^;
960×540だとか640×360にリサイズしたdivxだと再生できるので、おそらく横幅のサイズが大きすぎるせいだとは思うのですが・・・

mencoderでDivX化

保存用という意味ではm2tをそのままとっておくのが一番なんですが、DivXにしておくのが使い勝手はいいかと。
こんな感じでやってみました。
$ mencoder test.m2t \
-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=7000 \
-oac mp3lame -lameopts cbr:br=192 \
- vop scale=1280:720,hqdn3d,pp=lb \
- ffourcc DIVX \
-o test.avi
オプションを上から説明すると
・動画はlibavcodecを使ってmpeg4にする。なるべく綺麗にしてね(vhq)。ビットレートは7000K前後でお願い(vbitrate=7000)。
・音声はlameを使ってmp3にする。固定長ビットレート(cbr)の192kbps(br=192)でお願い。
・動画はインターレースを解除(pp=lb)して3Dノイズフィルタ(hqdn3d)をかけて1280×720にリサイズ(scale=1280:720)してね
・FFOURCCをDIVXとする(他の再生環境での互換性に考慮)
・test.aviというファイルに出力する
という具合いです。
ビットレートは1280×720/29.97fpsでのbppが0.25を超えるように7000kとしてみましたが、もう少し小さい値でも十分綺麗だと思います。

試し撮りした6分37秒の映像ですが、ファイルサイズはキャプチャした時点で1.3Gに、DivXにしたものは287Mになりました。
エンコードにかかる時間はハンパじゃないです。ウチのP4-2.4GHzのマシンで、上のエンコードを行うと4fpsぐらいで処理がすすみます。エンコードには録画時間のおよそ7.5倍の時間がかかる計算です。
保存をどうするかは、要検討です。とりあえずはテープのままが一番安上がりなので、撮りっぱなしが一番かも

ハードディスクに録画!?

mpg1394grabによるキャプチャですが、実は撮影モードでもキャプチャできちゃうんですね。録画ボタンとは連動しませんけど。
これってPC一台つかえば、HDD録画ができちゃうというわけで・・・

関連記事

3個のコメント

  1. 2005 年 8 月 24 日 3:20 AM に投稿 | パーマリンク

    はじめまして。Mac OSXでmencoderビルドして使ってます。

    1)質問があります。
     本文中のbppの計算式をご教示願えないでしょうか?
     当方の知識レベルはかなり低いので、ヒントだけで結構です。

    2)ご存知かもしれませんがインタレ解除は、filmdintも綺麗だと思います。
     lbは完全にインタレ縞を完全に潰しますが、副作用で色やディテイルが少し潰れる印象があるので
     -vfチェインは以下を使っています。(-vopは逆順、-vfは書いた順適用)

     -vf filmdint=io=2997:2997/fast=0/comb_thres=48/crop=720:480:0:0,pp=md,scale=,hqdn3d=4:3:6 \

     ・io=2997:2997は1:1でも良いと思います。文字通りioのfps比です。
      元来は映画の24fps化用なので、-vf filmdint -fps 30000/1001 -ofps 24000/1001で使うもののようです。
     ・fast=0はインタレ縞の発見にmmx/3Dnow!を使います。自分には無意味ですが。
     ・cropはfilmdintの子オプションで書くと-vfチェイン中の順番で悩まなくて良いので。
     ・pp=mdは若干解除漏れが残るので補助です。x86ではfast=0が効くので無用かもしれません。
     ・デノイズとスケールの順番はよくわかりません。
     ・pp=lbとの比較利点は、細かいディテイルが良く残ります。逆に細かいノイズが潰しきれないのでMPEG quantizerも併用してます。
     ・その結果、難点はサイズ肥大と低速化です。1280×720/29.97fpsともなると、おいそれとMPEG quantizerも使えないかもしれません。
     ・速度はPowerMacG5-2GHzで3fps程度です。 (720×480素材)

    ${iFN} \
    -oac mp3lame -lameopts cbr:br=128:vol=1: -srate 48000 -aid 0 \
    -ovc xvid -xvidencopts \
    pass=:bitrate=1028\
    :trellis:chroma_me:chroma_opt:hq_ac:quant_type=mpeg:cartoon\
    :max_key_interval=240:vhq=4:max_bframes=1:bvhq=1 \
    -vf filmdint=fast=0/comb_thres=48/crop=720:480:0:0,\
    pp=md,scale=640:480,hqdn3d=4:3:6 \
    -sws 9 -zoom -fps 30000/1001 -ofps 24000/1001 -noodml -o \
    ${oFN} \

  2. 2005 年 8 月 26 日 2:54 AM に投稿 | パーマリンク

    ばるさん、はじめましてです。OSXでmencoderってちょっと羨ましいな〜
    なるほどfilmdintですか、こんど使ってみます。
    bppは、
    bpp = vbitrate * 1000 / (width * height * fps)
    で出ます
    < 0.10: やめとけ
    < 0.15: これじゃ汚いだろ
    < 0.20: ブロックが目立つけど悪くないだろ
    < 0.25: きれいに見えるで
    > 0.25: マジで綺麗
    > 0.30: もったいない、解像度上げるべき
    ってことだそうで、経験上は0.20あればほとんど大丈夫です

  3. ばる
    2005 年 8 月 28 日 8:38 PM に投稿 | パーマリンク

    おそくなりましたが、お礼を。
    自分のブログのほうにもコメントを頂きまして、有り難うございます。
    ちょっと頑張って読んでみます。