お知らせ: にーやんのブログ 2 に移転しました。こちらのブログは、2009 年末までに削除します。

スポンサード リンク

Dustを使うと最終フレームが直前のフレームの画像に置き換わる現象について

2ちゃんねるのAvisynthスレッドで、「Trimの後にFaeryDustを使用すると、最終フレームがその直前のフレームの画像に置き換わる」という旨の書き込みがありました。

この現象については、たしかDoom9のフォーラムでも話題に上がったことがあったと思います(ちょっと検索してみましたが、どこのスレッドかわかりませんでした。私の勘違いかも)。

拙作iDust(旧FPDust)関数では、

最終フレームを1フレーム水増し -> Dustフィルタ -> ダブりフレームを削除

という方法で、これを回避していました。

今日は少し時間がとれたので、再度、この現象について確認してみました。すると、Trimフィルタの有無やDust系フィルタの種類に関係なく発生するようです。

そこで、iDustを使わずに、この現象を回避する方法を考えてみました。

final_frame = FrameCount()-1
DuplicateFrame(final_frame)
FaeryDust(2) # カッコ内の値は例
DeleteFrame(final_frame+1)

DuplicateFrameで最終フレームをコピーし、Dustフィルタをかけてから、DeleteFrameで水増ししたフレーム(追加されたフレームなので+1)を削除。iDustでやっているのと、基本的には一緒です。ただし、DuplicateFrameとDeleteFrameは音声に影響を与えないため、より安全性が高い方法であると言えます(音が欠けたりする心配はありません)。

また、上記のスクリプトに画像の大きさをチェックする機能を追加した関数(FaeryDustMod)を、インターレース素材系関数集(ver.0.4)に追加しました(この関数自体は、インターレース用ではありません)。またiDustとiDustBも、DuplicateFrameとDeleteFrameを使うように変更しました。

使ってみたい人は、にーやんな日々..._〆(゚▽゚*) :: インターレース素材系関数集から、myFunctions.avsをダウンロードしてください。

Dependency Walkerでプラグインの動作に必要なDLLを調べる

AviSynthで外部プラグインを利用する際に、必要なモジュール(DLLファイル)が不足していることが原因で、これらのプラグインが使えないということがあります。たとえば、warpsharpプラグインを使うためにはmsvcp71.dllとmsvcr71.dllが必要であるというのは、(AviSynth使いの間では)有名な話です。

しかし、一体、どのモジュールが不足しているのが原因なのか、わからないこともあるでしょう。そのようなときに使える(かもしれない)のが、Dependency Walkerというユーティリティ・ソフトウェアです。

Dependency Walker (depends.exe) Home Page
http://www.dependencywalker.com/

Dependency Walkerは、以下のようなことを行います。

Dependency Walkerは、32ビット/64ビットのWindowsモジュール(exe, dll, ocx, sys, etc.)をスキャンし、すべての従属関係にあるモジュールの階層的なツリー状の一覧表を構築する、フリーのユーティリティです。見つけられた各モジュールに関して、そのモジュールによってエクスポートされるあらゆる関数と、それらの関数のうちのどれが、実際に他のモジュールによって呼び出されているかを表にします。もう一つのビューは、ファイルのフルパス、ベースアドレス、バージョン番号、マシンタイプ、デバッグ情報などを含む詳細な情報と一緒に、必要とされるファイルの最小限のセットを表示します。

ためしに、いくつかのプラグインを、Dependency Walkerで見てみました。

# IT.dll(IT_YV12)

Dependency WalkerでIT.dllをスキャンしたところ
kernel32.dllのみがリストアップされています。

# LoadPluginEx.dll

Dependency WalkerでLoadPluginEx.dllをスキャンしたところ
kernel32.dll、msvcp71.dllとmsvcr71.dllの3つがリストアップされています。

# warpsharp.dll

Dependency Walkerでwarpsharp.dllをスキャンしたところ
kernel32.dll、msvcp71.dllとmsvcr71.dll以外にも、多くのDLLファイルがリストアップされ、ツリー化されています。

これらの結果を参考にすれば、不足しているDLLファイルを突きとめるのに役立つでしょう。

インターレースなクリップへのフィルタリング

インターレース素材系関数集関連のページ(とりわけiFilterとiFilterTの違い)で、AviSynthでインターレース素材にフィルタをかける方法と、その違いについて説明しました。でも、かなり怪しいうえに、わかりにくい説明だったと思います。

Doom9のフォーラムで、stickboyさんが、インターレースなクリップにフィルタをかける方法についてまとめてくれていましたので、紹介します(日本語に訳す際に、一部表現をわかりやすいように変えています)。

空間軸(2D)フィルタのみ:
SeparateFields -> フィルタ -> Weave

時間軸フィルタのみ:
単にフィルタをかけるだけ

空間軸-時間軸フィルタ:
次のどれか:
A. SeparateFields -> SelectEven/SelectOdd -> filter -> Interleave -> Weave
B. JDL_UnfoldFieldsVertical -> filter -> JDL_FoldFieldsVertical
C. scharfis_brainの方法: Bob -> filter -> SeparateFields -> SelectEvery -> Weave

# 補足1: 空間軸(2D)フィルタのみ

SeparateFields -> フィルタ -> Weave
これは、iFilterで使用している方法と同じです。


# 補足2: 空間軸-時間軸フィルタ:

A. SeparateFields -> SelectEven/SelectOdd -> filter -> Interleave -> Weave
これは、iFilterTiDustで使用している方法と同じです。

B. JDL_UnfoldFieldsVertical -> filter -> JDL_FoldFieldsVertical
JDL_UnfoldFieldsVerticalとJDL_FoldFieldsVerticalは、stickboyさんが作成した関数です。stickboyさんのホームページから入手することができます(jdl-interlace.avsiに収録)。

C. scharfis_brainの方法: Bob -> filter -> SeparateFields -> SelectEvery -> Weave
これは、iFilterBiDustBで使用している方法と同じです。scharfis_brainさんがDoom9のフォーラムで、この方法を紹介したことから、scharfis_brainの方法(scharfis_brain's method)と書かれています。

# 私が紹介していたら、niiyan's methodになっていたのだろうか・・・(笑)

画像の縁を端の色で塗りつぶす方法あれこれ

画像の端を切り落とすにはCrop、縁を追加するならAddBorders、塗りつぶすならLetterbox・・・と、AviSynthには、画像の端のノイズや無効領域などを処理するフィルタが、複数、存在します。また、リサイズ用フィルタのオプションパラメータで画像の端を切り落とすこともできます。

しかし、黒などの単一色で塗りつぶすのではなく、トリミングした画像の端の画像(ライン)に置き換えたいと思うことがあるかもしれません。そんなときに使えるかもしれないフィルタや関数をリストにまとめてみました(元ネタはDoom9のAvisynth Developmentのとあるスレッド)。

  • Padding: Manao氏作。MVToolsプラグインに収録。YV12のみ。
    Padding(clip, int hpad, int vpad)
  • BorderControl: Simon Walters氏作。YUY2/YV12対応。
  • FillMargins: trbarry氏作。YV12のみ。
  • BorderMirror: Didee氏作。ユーザー定義関数。
    Function BorderMirror( clip clp, int "hh", int "vv")
    {
    hh = default( hh, 8 )
    vv = default( vv, 8 )

    top=clp.crop(0,0,-0,vv)
    bot=clp.crop(0,clp.height-vv,-0,-0)

    stackvertical( top.flipvertical(),clp,bot.flipvertical() )

    left=last.crop(0,0,hh,-0)
    right=last.crop(last.width-hh,0,hh,-0)

    stackhorizontal(left.fliphorizontal(),last,right.fliphorizontal())

    return last
    }

一番下の関数を見ると、外部プラグインを使わなくても、CropとStackHorizontal/StackVerticalを組み合わせれば簡単に実現できるようです。ただし、色空間等によるCropの制限を考慮に入れる必要があります(こちらを参照)。

# AviSynth WikiのCropのページを修正してくれた人、ありがとう。Wikiでよかったと、つくづく思いました。

VirtualDubModで壊れたAVIが出力される?

【FAQ】VirtualDubModで壊れたAVIが出力される - AviSynth Wiki
2ちゃんねるのAviSynthスレッドで話題にあがった話です。FAQにしたほうがよさそうだったので、Wikiの方に追加してみました。

短いソースを使った簡単なテストしかしてないので、間違っている可能性があります。とりあえずまとめたって感じで、この問題に関して情報収集とかもしてません(ぉ

もし情報などお持ちの方があれば、Wikiを編集してもらうなり、このエントリにコメントするなりしてもらえると助かります。

すごい久しぶりにVirtualDubMod使ってエンコした気がする・・・。

Page 3 of 5: « 1 2 3 4 5 »