Write のバックアップソース(No.1)

#code{{
WriteFile(clip clip, string filename, string expression1, ..., string expression16 [, bool append, bool flush])
}}

#code{{
WriteFileIf(clip clip, string filename, string expression1, ..., string expression16 [, bool append, bool flush])
}}

#code{{
WriteFileStart(clip clip, string filename, string expression1, ..., string expression16 [, bool append])
}}

#code{{
WriteFileEnd(clip clip, string filename, string expression1, ..., string expression16 [, bool append])
}}

WriteFile は、'''expressionN'''((訳者註: WriteFile の 第 3 引数以降の string 型の引数のこと。expression は式の意。N には 1 から 16 までの数字が入る。)) を評価して、その結果を文字列に変換し、ファイルに書き出します。

"ランタイム"変数((訳者註: ランタイムは「実行時」の意。フィルタの実行時にフレームごとに評価され、値が代入される特別な変数。同じくフレームごとに結果を返すランタイム関数もある。詳しくは、ConditionalFilterを参照。))の current_frame は、"expression(式)" の中で使えるように設定されます(これは、[[ScriptClip>ConditionalFilter]] の場合と同じように動作します。詳しい情報は、ドキュメントで確認してください)。current_frame は、スクリプトが読み込まれるときは -1 に、スクリプトが閉じられるときは -2 に設定されます。

WriteFile はフレームごとに出力を生成し、WriteFileIf は最初の式が true(真)の場合にのみ出力を生成します。スクリプトのオープンやクローズにおいての出力はありません。WriteFileStart と WriteFileEnd は、スクリプトのオープン時とクローズ時にのみ出力を生成します。フレームごとのアクションはありません。

'''append = true''' のとき、結果は存在するファイルに追加されるでしょう。

'''flush = true''' のとき、ファイルは各演算のあとにクローズされ、再オープンされます。そのため、すぐに結果を見ることができます(これにより遅くなるかもしれません)。

WriteFileStart と WriteFileEnd に関しては、'''flush''' はつねに true です。

append のデフォルトは、WriteFileStart(デフォルトは false)を除いて、つねに true です。

これについては、いくつかの簡単な例で説明するのがベストです:

#code{{
filename = "c:\myprojects\output.txt"
# フレームを取得するためにテスト用のビデオを作成
Version()

# ここでの式は評価されファイルに書き出される変数のみである
# あなたは各行にフレーム番号を伴ったファイルを得るだろう
WriteFile(filename, "current_frame")

# この行はスクリプトが開かれたときに書き込まれる
WriteFileStart(filename, """ "This is the header" """)

# そしてスクリプトが閉じられたときにこれが書き込まれる
WriteFileEnd(filename, """ "Now the script was closed" """)
}}

文字列の中に文字列をタイプするために、3重の引用符をどのように使うことができるかを見てください!

式が評価不可能なら、代わりにエラーメッセージが書き込まれます。

WriteFileIf における If-式についてこれが起こる場合は、結果は true であると仮定されます。

#code{{
# "I don't know what "this" means" という結果に終わるだろう。
WriteFile(filename, "this is nonsense")
}}

ファイルの中に数字を書くための、もっと簡単な方法があります。''しかし''、この例に関しては、"ランタイム関数"を[[FrameEvaluate>ConditionalFilter]] と一緒に使う方法を確認することができます:

#code{{
# 異なったフレームを取得するためにテスト用のビデオを作成
Version.FadeIn(50).ConvertToYV12

# これはフレーム番号、":"(コロン)とそのフレームの輝度の平均値をプリントするだろう
colon = ": "
WriteFile("F:\text.log", "current_frame", "colon", "AverageLuma")
}}

あるいは、もしかしたら実際の時間をプリントさせたいかもしれません:

#code{{
# 異なったフレームを取得するためにテスト用のビデオを作成
Version.FadeIn(50).ConvertToYV12

# これはフレーム番号、現在の時間とそのフレームの輝度の平均値をプリントするだろう
# 3重の引用符は文字列の中に引用符を置くために必要
WriteFile(last, filename, "current_frame", """ time(" %H:%M:%S") """, "AverageLuma")
}}

''その他の使用例:''

WriteFileIf では、1つ目の式はブーリアン((訳者註: 参考 - [[ブーリアンとは 【boolean】 ─ 意味・解説 : IT用語辞典 e-Words:http://e-words.jp/w/E38396E383BCE383AAE382A2E383B3.html]]))(true または false)であると期待されています。

それが TRUE である場合にのみ、他の式が評価され、その行がプリントされます。

(覚えておいて下さい: && は「かつ」、|| は「または」、== は「等しい」、!= は「等しくない」です。)

そのようにして、あなたのファイルから完全に行を省くことができます。

#code{{
# 異なったフレームを得るためにテスト用のビデオを作成
Version.FadeIn(50).ConvertToYV12

# これはフレーム番号をプリントするが、AverageLumaが30と60の間にあるフレームのみプリントするだろう
WriteFileIf(last, filename, "(AverageLuma>30) && (AverageLuma<60)", "current_frame", """ ":" """, "AverageLuma")
}}

|v2.55|初版|

#hr

註: このページは、[[Write - avisynth.org:http://www.avisynth.org/Write]]の日本語訳です。