これは、かつて「AviSynthのぺーじ」として公開されていたものの "残骸" です。ここに記されている内容には、間違いが含まれている可能性があります。より正確で新しい情報を知りたい場合は、AviSynth 付属のドキュメントや AviSynth 公式サイトを参考にすることをおすすめします。私(にーやん)が管理人をつとめる AviSynth Wiki も利用してください。また、このページは、予告なしに削除される可能性もあります。

すべてのバージョン共通

#トップファースト
AssumeFrameBased().ComplementParity()

#ボトムファースト
AssumeFrameBased()

AviSynth2.0.4以降の場合

 AviSynth2.0.4からAssumeTFF/AssumeBFFフィルタによって、フィールドオーダーを指定することができるようになりました。
#トップファースト
AssumeTFF()

#ボトムファースト
AssumeBFF()

フィールドオーダーの判別法

1.AviUtlを使った判定方法

 AviUtlで60fps読み込みすることにより、フィールドオーダーを確認することができます。詳しくはチュートリアルで紹介していますので、参考にしてください。

[フレームレートの判別法]
 上記の方法で1フレームずつコマ送りにしたときに、次のいずれにあてはまるかで、ソースのフレームレートがわかります。
1コマづつ動く -> 60fpsもの(30i または 60p)
2コマづつ動く -> 30fpsもの(または 30p)
2コマ3コマ動く -> 24fpsもの
※iはインターレース、pはプログレッシブを表します。
※この判別法はネーサさんに教えていただきました。ありがとうございました。

2.TMPGEncによる判定

あおの規格外Video-CD企画さんに解説があります。

3.Avisynthによる判定(1)

AVSファイルに、以下のように記述してください。

subtitle(last.GetParity() ? "トップ優先":"ボトム優先", font="MS Pゴシック")

このスクリプトは「Avisynth側でソースをどう捉えているか」を示すものらしいです。 Avisynthでは、基本的にはAVIソースはボトムと判定し、MPEG2DECなどのプラグインを使用している場合にトップと判定するようです。

4.Avisynthによる判定(2):trbarry(Tom Barry)氏の関数

以下のスクリプトをメモ帳にコピー&ペーストし、適当な名前をつけて保存します。プラグイン、および、ソースまでのパスは書き換えてください。

LoadPlugin("mpeg2dec.dll") #AVIソースの場合、不要。
v=Mpeg2Source("D:\test.d2v")
#v=AviSource("D:\test.avi") #AVIソースの場合。

function CheckTopFirst(clip v1){
v2=v1.subtitle(v1.GetParity?"TF":"BF")
v3=v2.GetParity?v2.ComplementParity:v2
t0=v3.ComplementParity
t1=t0.separatefields
t2=compare(t1.trim(1,0),t1)
b1=v3.separatefields
b2=compare(b1.trim(1,0),b1)
return stackvertical(t2,b2)}

CheckTopFirst(v)


判定方法
このスクリプトをVirtualDubModなどのソフトで開いてください。
すると、トップとボトムそれぞれ半分のフィールドを使った画像が上下に分割されて表示されると思います。 上がトップ、下がボトムです。
これを数フレーム、プレビューします。
そして、次の4つの点に注目して判定してください。

(1)TFかBFか
画面左上隅に表示されている文字をチェックします。
TF / TopFirst
BF / BottomFirst

(2)Jerky
上下の画像を比較したときに、画像が乱れて(jerky)いないほうのフィールドが優先であると考えられます。
たとえば、上の画像のほうが急に動いてたりするのが目立つ場合、その反対の下側(=ボトムフィールド)が優先である可能性が高いということになります。

(3)Avg Mean Dev
上下の画像上にいくつかの数値が表示されると思いますが、この中の"Mean Abs Dev"の"avg"(平均値)をチェックします。
この数値が低いほうのフィールドが優先であると考えられます。

(4)Avg PSNR
この数値が高いほうのフィールドが優先であると考えられます。

以上の4点がすべて一致していれば、この関数によって示された結果の精度はかなり高いものと思われます。 ただし、そうでない場合は、必ずしもこの判定結果が正しいとは限りませんので、他の判定方法を併用するほうといいでしょう。

※この関数は、Doom9Forumにtrbarry(Tom Barry)氏が投稿したものです。

5.Avisynthによる判定(3):sh0dan氏の関数

以下のスクリプトをメモ帳にコピー&ペーストし、適当な名前をつけて保存します。プラグイン、および、ソースまでのパスは書き換えてください。※要Avisynth2.5 & YV12。

LoadPlugin("MPEG2Dec3.dll") #AVIソースの場合、不要。
v=Mpeg2Source("D:\test.d2v")
#v=AviSource("D:\test.avi") #AVIソースの場合。

function CheckTopFirst(clip v1){
global top_hits=1
global bot_hits=1
global text = ""
global text2 = ""
v1 = assumeframebased(v1)
global tff=assumetff(v1).separatefields().bob()
global bff=assumebff(v1).separatefields().bob()
istff = tff.subtitle("Is frame TFF: TRUE").frameevaluate("top_hits=top_hits+1.0")
isnottff = tff.subtitle("Is frame TFF: FALSE").frameevaluate("bot_hits=bot_hits+1.0")

outclip = conditionalfilter(tff,istff, isnottff, "yDifferenceFromPrevious(tff)+ydifferenceToNext(tff)","<","yDifferenceFromPrevious(bff)+yDifferenceToNext(bff)",false)
outclip = frameevaluate(outclip,"text = "+chr(34)+"STATS: TFF = "+chr(34)+" + string(100.0*top_hits/(top_hits+bot_hits)) + " + chr(34) + "%"+chr(34))
outclip = frameevaluate(outclip,"text2 = "+chr(34)+"STATS: BFF = "+chr(34)+" + string(100.0*bot_hits/(top_hits+bot_hits)) + " + chr(34) + "%"+chr(34))
outclip = scriptclip(outclip, "Subtitle(text,y=50)")
outclip = scriptclip(outclip, "Subtitle(text2,y=70)")
return outclip
}

CheckTopFirst(v)

次の2点からフィールドオーダーを判定します。
(1)Is frame TFF: TRUE / Is frame TFF: FALSE
(2)STATS: TFF = 〜%

※この関数は、Doom9ForumにshOdan氏が投稿したものです。

6.Avisynthによる判定(4):ViewFields / UnViewFields

詳細不明。

ViewFields http://www.geocities.com/siwalters_uk/viewfields.html
UnViewFields http://www.geocities.com/siwalters_uk/unviewfields.html

最終更新日 2003年11月23日