DirectShowの話題なのですが、プログラムネタではないです。
とあるビデオの検証で「アルファブレンドが可能なビデオミキシングフィルタが欲しい」と言うことが出ました。で、こういう機能を持つ物を検索しまくりました。
VMRでそれをやろうとするとWindows標準のフィルタ+GraphEditではそれができないので探してみたわけです。無ければ作ろうとまで思っていました。
「VideoMixingFilter」なる物は?
名称で当たりをつけるとこういう物が出てきました。あたりかな?と思って調べてみましたがさにあらず。
なんと2つのビデオを左右に並べるというなんか機能がずれているフィルタでした。
ちなみに、このフィルタはsourceforgeにvideoprocessingという項目で作成されていたDirectShowのフィルタの一つです。
似たような物に「PicInPicFilter」というテレビのサブ表示のように指定した位置に縮小したビデオラインを上から表示する、という物もありました。
これでは機能的には使えなさそうです。作るときのベースにはなりそうな気がしましたが。
なお、ソースコード上にはあるのに単体では手に入らないフィルタとして「AudioMixingFilter」という2つのオーディオラインを合成するというおもしろいフィルタもありました。
使う場面はあまりなさそうですが・・・。
お目当ての機能のフィルタは「MediaLooks Video Mixer」というもの
一応フリーらしいので手に入れてもいいと思います。これ以外にもちょっとしたフィルタが含まれていますので試してみる分にはいいと思います。
このフィルタの機能は「接続されたすべてのビデオラインを対象にエフェクトをかけてミキシングを行い一つのビデオラインとして出力する」というものです。
エフェクト機能が意外と多彩なので遊びで使うにはもってこいかもしれません。今回の目的である「ビデオラインのアルファブレンド」には完全に合致します。
が、このフィルタはちょっと癖がある
使うのに微妙に苦労しました。というのも、どうやらフィルタにかなり癖があるようで気をつけて使わないとレンダリングされません。
ちなみに問題点としては
- アルファブレンドを行うときはビデオ入力(出力)フォーマットを一度RGB系にしないと内部で変換処理によるオーバーヘッドが激しいらしくコマ落ちする
- 特定のビデオレンダラを接続するとビデオをレンダリングできない(システム標準のVideo Rendererは大丈夫。Win7CodecsについてくるHaali Video Rendererはだめ)
ということがわかっています。
これについては後者はそのままなので無視しますが、前者については入力前に強制フォーマット変換を行う必要があります。
使うフィルタはffdshowのffdshow raw video filterというやつです。フィルタ数の制限を無くした上で出力フォーマットをRGB32のみチェックにすると
通過した後のフォーマットは強制でRGB32になるのでこれを使ってミキシング前の変換を行うといいです。
ミキシングがうまくいったときはかなり感動的でした。やりたかったことはただの間違いさがし(過去のOP動画と現在のOP動画でどこが違うのか重ねてみたかっただけ)なのですが・・・。
とりあえず性質がわかったので料金を払うできか考えます・・・。
ちなみに、aviutlのバーションによってはffdshowとの相性問題が出る可能性があり
似たような豆知識ですが、aviutlのバージョンによってはオーディオサンプルとして浮動小数サンプルを受け付けることができないため、ffdshow経由で出力されたサウンドラインをエンコードできないことがあります。
このときはffdshow Audio Decoderの設定で出力のチェックを16bit整数のみにするとaviutlでもサウンドラインをエンコードできるようになります。
aviutlでの処理が終わったらちゃんと戻しておきましょう。できる限りサウンドラインのフォーマットは上級な方がいいと思いますので。