イントロダクション
*********

VHOOK は廃止予定であること、そしてそのためその開発は凍結されている(バグフィクスはまだ受け入れています)ことをご了承ください。これに代わるものが 'LIBAVFILTER' で、我々の 'VIDEO FILTER API' GOOGLE SUMER OF CODE プロジェクトの成果です。 HTTP://LISTS.MPLAYERHQ.HU/MAILMAN/LISTINFO/FFMPEG-SOC の FFMPEG-SOC メーリングリストを購読することで、その進行状況を観察することができます。

ビデオフック機能は(ほぼ)ライブの映像のために設計されています。この機能によってデコーダーとエンコーダーの間で映像を変更する、または検査することができます。

いくつものフックモジュールをインラインに置くことができ、それらは ffmpeg のコマンドライン上に指定された順序で実行されます。

ビデオフックモジュールはあなた自身のモジュールの基礎として使えるように用意されており、以下で説明されています。

モジュールは ffmpeg の -vhook オプションを使ってロードされます。このパラメーターの値は空白文字で区切られた引数のリストです。リストの最初がモジュールの名前で、残りは引数としてモジュールの Configure function に渡されます。

モジュールは動的なライブラリです: あなたのプラットフォームに応じて異なる拡張子(.so, .dll, .dylib) を持ちます。そしてそれらが PATH、もしくは LD_LIBRARY_PATH のどこになければならないかあなたのプラットフォームが指示します。さもなくば、あなたは使おうとしている vhook ファイルのフルパスを指定しなければならないでしょう。

null.c
======

これは何もしません。実際には入力画像を RGB24 に変換し、それを再び変換し直します。あなたが設定をテストするのに使えるサンプルとして意図されています。

fish.c
======

これは'魚群探知機'を実装しています。本質的にはこれは画像を HSV 空間に変換し、そして特定の HSV 単位立方体に収まるピクセルのパーセンテージがある割合を越えるかどうかをテストします。もしそうなら、他のコードで処理するためにその画像は 1つのファイルとして保存されます。

どうして HSV を使うのか? HSV 単位立方体が RGB 単位立方体よりコンパクトな色の幅で表現することが分かっています。

imlib2.c
========

このモジュールは映像イメージに対するテキスト装飾を実装しています。現時点では固定された装飾またはファイルからのテキストの読み込みをサポートしています。画像上に日付と時刻を押しやすいように文字列は strftime() を通じて渡されます。

このモジュールは、外部のライブラリ imlib2 に依存しており、まだあなたのシステムにインストールされていない場合でも Sourceforge その他の場所で入手できる。

あなたはまたテレビ局がしているように画像(一様な半透明)をかぶせることもできます。例えば、スクロールするクレジットを作成するために映像の周辺でテキストまたは画像を動かすことができます。

使用されるフォントファイルは FONTPATH 環境変数から探され、そしてコマンドラインオプションの通りにポイントサイズが付け足されます。以下のようにフルパスでフォントファイルを指定することもできます:

     -F /usr/X11R6/lib/X11/fonts/TTF/VeraBd.ttf/20

ただし 20 はポイントサイズです。

RGB 色名を読み込むファイル名を指定できます。何も指定されていない場合には、次の既定値が利用されます: /usr/share/X11/rgb.txt と /usr/lib/X11/rgb.txt です。

オプション:

-C <rgb.txt>     RGB 色名を読み込むファイル名
-c <color>       テキストの色
-F <fontname>    フォントの形状とサイズ
-t <text>        テキスト
-f <filename>    テキストを読み込むためのファイルの名前
-x <expression>  テキストまたは画像の x 座標
-y <expression>  テキストまたは画像の y 座標
-i <filename>    画像を読み込むためのファイルの名前
-R <expression>  赤色の値
-G <expression>  緑色の値
-B <expression>  青色の値
-A <expression>  アルファチャンネルの値

次の表現は変数として機能します:

N   (0から始まる)フレーム番号
H   フレームの縦幅
W   フレームの横幅
H   画像の縦幅
W   画像の横幅
X   直前のテキストまたは画像の x 座標
Y   直前のテキストまたは画像の y 座標

また定数 PI、E、さらに BITS2QP(BITS) と QP2BITS(QP) を除く (ffmpeg-doc.html#SEC13) に記載されている FFmpeg 式評価器で利用できる数学関数を使うことができます

利用例:

        # フォントのパスを設定することを忘れないこと
        FONTPATH="/cygdrive/c/WINDOWS/Fonts/"
        FONTPATH="$FONTPATH:/usr/share/imlib2/data/fonts/"
        FONTPATH="$FONTPATH:/usr/X11R6/lib/X11/fonts/TTF/"
        export FONTPATH

        # リサージュ状に球体が舞う
        ffmpeg -i input.avi -vhook \
          'vhook/imlib2.dll -x W*(0.5+0.25*sin(N/47*PI))-w/2 -y H*(0.5+0.50*cos(N/97*PI))-h/2 -i /usr/share/imlib2/data/images/bulb.png' \
          -acodec copy -sameq output.avi

        # テキストのスクロール
        ffmpeg -i input.avi -vhook \
          'vhook/imlib2.dll -c red -F Vera.ttf/20 -x 150+0.5*N -y 70+0.25*N -t Hello' \
          -acodec copy -sameq output.avi

        # 監視カメラスタイルの日付とタイムスタンプ
        ffmpeg -r 29.97 -s 320x256 -f video4linux -i /dev/video0 \
          -vhook 'vhook/imlib2.so -x 0 -y 0 -i black-260x20.png' \
          -vhook 'vhook/imlib2.so -c white -F VeraBd.ttf/12 -x 0 -y 0 -t %A-%D-%T' \
          output.avi

          この例では、映像がビデオキャプチャーカードから 320x256 AVI としてキャプチャー
          されています。そして黒い 260x20 ピクセルのPNG 画像が左上隅に配置され、
          その上に曜日、日付および時刻が Vera Bold 12 で重ねられています。
          横幅 260 ピクセル縦幅 20 ピクセルの単純な黒い PNG ファイルは、
          この目的のために GIMP で作成されました。

        # テキストファイルからのクレジットのスクロール
        ffmpeg -i input.avi -vhook \
          'vhook/imlib2.so -c white -F VeraBd.ttf/16 -x 100 -y -1.0*N -f credits.txt' \
          -sameq output.avi

          この例では、テキストはあるファイルに格納されており、映像の左側の端から
          100ピクセルに位置しています。テキストは下部から上にスクロールされます。
          y因子を正にすることで上部から下にスクロールするようになります。
          y因子の大きさを増やすことでテキストは速くなり、大きさを減らすことで
          遅くスクロールするようになります。ヒント: 1つの改行だけを含む空行は
          ファイルの終わりとして扱われます。空行を作成するには、空白文字だけからなる
          行を使ってください。

        # テキストファイルからカスタムされた色でのクレジットをスクロール
        ffmpeg -i input.avi -vhook \
          'vhook/imlib2.so -C rgb.txt -c CustomColor1 -F VeraBd.ttf/16 -x 100 -y -1.0*N -f credits.txt' \
          -sameq output.avi

        この例は上の例と同じことをしますが、rgb.txt ファイルを使うよう指定しており、
        このファイルにはカスタムメイドの色が入っています。

         # 可変の色
         ffmpeg -i input.avi -vhook \
           'vhook/imlib2.so -t Hello -R abs(255*sin(N/47*PI)) -G abs(255*sin(N/47*PI)) -B abs(255*sin(N/47*PI))' \
           -sameq output.avi

           この例では、黒から白へとテキストの色が上下します。

        # テキストのフェードアウト
        ffmpeg -i input.avi -vhook \
          'vhook/imlib2.so -t Hello -A max(0,255-exp(N/47))' \
          -sameq output.avi

          この例では、25 fps の入力ビデオファイルについて約10秒のうちにテキストが
          フェードアウトします。

        # 画像ファイルからのクレジットのスクロール
        ffmpeg -sameq -i input.avi \
          -vhook 'vhook/imlib2.so -x 0 -y -1.0*N -i credits.png' output.avi

          この例では、映像と同じ横幅(つまり320ピクセル)ですが縦にとても長い
          (つまり3000ピクセル)透過 PNG ファイルが作成され、テキスト、グラフィクス、
          およびストロークなどがその画像に加えられました。そうして画像は
          フレームの下部から上にスクロールされています。

ppm.c
=====

これは基本的には PPM パイプのための起動ポイントです。これによって PPM を標準入力から消費し、かつ PPM を標準出力に生成(し、各フレームごとにフラッシュ) する任意の実行可能ファイル(またはスクリプト)が使えます。 Netpbm ユーティリティーはそういったプログラムの集まりです。

それらのリストは以下にあります:

http://netpbm.sourceforge.net/doc/directory.html

利用例:

     ffmpeg -i input -vhook "/path/to/ppm.so some-ppm-filter args" output

drawtext.c
==========

このモジュールは映像イメージに対するテキスト装飾を実装しています。現時点では固定された装飾またはファイルからのテキストの読み込みをサポートしています。画像上に日付と時刻を押しやすいように文字列は strftime() を通じて渡されます。

機能:

  - FreeType2 ライブラリによる TrueType、Type1 その他のフォント

  - Font カーニング(より良い出力)

  - 行の折り返し(1行に収まらないテキストを次の行に書き出す)

  - 背景のボックス(現在開発中)

  - アウトライン

オプション:

-c <color>            テキストの前景色('インターネット'方式) <#RRGGBB> [既定値 #FFFFFF]
-C <color>            テキストの背景色('インターネット'方式) <#RRGGBB> [既定値 #000000]
-f <font-filename>    使用するフォントファイル
-t <text>             表示するテキスト
-T <filename>         テキストを読み込むファイル名
-x <pos>              テキストが開始する x 座標
-y <pos>              テキストが開始する y 座標

テキストのフォントは FONTPATH 環境変数の中から探されます。 FONTPATH 環境変数が利用できない場合、またはあなたの対象で確認できない (つまり Cygwin の)場合、次のようにフルパスで指定してください:

     -f /usr/X11R6/lib/X11/fonts/TTF/VeraBd.ttf

利用例:

        # フォントのパスを設定することを忘れないこと
        FONTPATH="/cygdrive/c/WINDOWS/Fonts/"
        FONTPATH="$FONTPATH:/usr/share/imlib2/data/fonts/"
        FONTPATH="$FONTPATH:/usr/X11R6/lib/X11/fonts/TTF/"
        export FONTPATH

        # 時刻と日付を表示
        ffmpeg -f video4linux2 -i /dev/video0 \
        -vhook 'vhook/drawtext.so -f VeraBd.ttf -t %A-%D-%T' movie.mpg

          この例では映像を1番目のキャプチャーカードからグラブし、それを
          MPEG ビデオとして出力します。そして "Weekday-dd/mm/yy-hh:mm:ss" を
          フレームの左上に配置し、毎秒更新され、Vera Bold TrueType フォントが
          使われています。このフォントは /usr/X11R6/lib/X11/fonts/TTF/ に
          あるはずです。

日付と時刻の書式化のためのありとあらゆる方法については、 strftime() の man ページを確認してください。

watermark.c
===========

コマンドラインオプション:

-m [0|1]              モード(既定値: 0、下を見よ)
-t 000000 - FFFFFF    出発点、6つの16進数
-f <filename>         watermark 画像のファイル名、必ず指定すること!

モード0: watermark 画像は次のように作用します(色が張る大きさを0から0xFFと仮定します): 各色ごとに次のことをします: マスクの色が0x80なら, 元のフレームを変更しません。マスクの色が0x80より小さければ、絶対差がフレームから差し引かれます。結果が0より小さければ、結果を0とします。マスクの色が0x80より大きければ、絶対差をフレームに足します。結果が0xFFより大きければ、結果を0xFFとします。

0x80という水準を -t フラグで変えることができます。例えば出発点が000000なら、watermark の色の値は目標地点に向けて足されます。

この方法により明るい画像でも暗い画面でもどちらでも見えるマスクを作ることができます (例えば Gimp や bump map ツールで生成した画像を使うことによって)。

例となる watermark ファイルは次にあります: http://engene.se/ffmpeg_watermark.gif

モード1: 各色ごとに次のことをします: もしマスクの色が出発点の色より大きければ、watermark のピクセルが利用されます。

利用例:

        ffmpeg -i infile -vhook '/path/watermark.so -f wm.gif' -an out.mov
        ffmpeg -i infile -vhook '/path/watermark.so -f wm.gif -m 1 -t 222222' -an out.mov