mojimoji 関数を更新
テキストの移動と拡大縮小を行うための関数 mojimoji を更新しました。変更点は、以下のとおりです:
変更点
- 複数行の文字列に対応(2.57 以降の場合のみ。Subtitle 向けの書式に変換する必要あり)
- x/y が -1 の時に中央寄せされてしまう問題に対処(回避策)
- グローバル変数名の変更(変数名の衝突をなるべく回避するため)
- パラメータの順番の変更(x2, y2 が指定されていない場合は移動なしが可能に)
- mojimojiOvr 関数(テスト版)を追加。
ダウンロード
mojimoji関数: テキストの移動と拡大縮小からダウンロードできます。
変更点に関する補足説明
複数行の文字列への対応
lsp パラメータが指定可能になっています(デフォルトでは lsp = 0)ので、文字列内に \n が含まれていれば、そこで改行されます。以下の記事も参照。
- Project N: 025 - Subtitle フィルタの複数行サポート(AviSynth v2.57 以降)
- 複数行の文字列を Subtitle フィルタ形式に変換する JavaScript
- 複数行の文字列を Subtitle フィルタ形式に変換する AvsP 用マクロ
x/y が -1 の時に中央寄せされてしまう問題
Subtitle では x と/または y を -1 に設定すると中央揃えされるので、x と/または y が -1 の時は強制的に 0 になるようにした。
mojimojiOvr 関数(テスト版)
ConditionalReader を使ってテキストを移動させるバージョン。移動、ズームのほかにフェードにも対応。
実験目的で作っただけのものです。ConditionalReader の使用例として参考になるかもしれません。
注意
- パラメータの順番を変更したため、以前の書式で記述されたものはそのままでは使用できません。ご注意ください。
- mojimojiOvr はテスト版であり、ちゃんと動作するかどうかもわかりません。また、今後更新する予定もありません。
FilterRange で最終フレームまでを範囲に指定すると 1 フレーム水増しされる件
Leben ist vorbei \(^o^)/: FilterRange を読んで、自分が改造したもののことを思い出したので、もう一回、確認の意味で調べてみました。にーやんのブログ :: プチ更新情報に、この件についての記述があるので、約 4 年前のネタになります……。
検証
以下のようなスクリプトを作成します。
# ソース
ColorBars(320,240).Trim(0,9) # 10 フレームのみ
# フレーム番号の追加
ScriptClip("Subtitle(String(current_frame), size=120, align=5)")
# FilterRange
FilterRange(7, 9, "Invert()") # 最終フレームまで
FilterRange 適用前は

このようなクリップだったのが、FilterRange 適用後は

こうなります。やはり最後の 1 フレームが水増しされています。そして、水増しされたフレームは、フィルタ適用前のものです。
原因と対策
c3 = clip.trim(end + 1, 0)
オリジナルの FilterRange では、ここで end + 1 から 0(0 は最後までを意味する)を選択しているのですが、end が最終フレームの場合、c3 には最終フレームが入ります。
c = end == 0 ? c : c + c3
そして、end が最終フレームの番号と一致しても end == 0 の条件にはあてはまらないので、c に c3 (つまり最終フレーム)を結合したクリップを返します。これが 1 フレーム水増しされる原因です。
これを防ぐには、最低限、end が最終フレームの場合にも c のみを返すように条件を追加すればいいことになります。最終フレームかどうかの判定には、FrameCount() 関数を使用するとよいでしょう。
改造版
AviSynth Wiki - FilterRange に改造版をアップしました。以前、改造したものより、さらに手を加えてあります。もう少しうまく書けそうですな気もしますが、今日のところはこれで。
関連ページ
ShowTimeCode 関数を更新。AviSynth Wiki へ移動。
ShowTimeCode - タイムコードを表示する関数を更新しました。
AviSynth Wiki 内に ShowTimeCode のページ(AviSynth Wiki - ShowTimeCode)を設けましたので、今後はそちらを参照してください。ブログのページもそのまま残しておきますが、スクリプトは AviSynth Wiki からのみ入手可能です。
なお今回の更新では、2ちゃんねる「お前らのショボイAvisynthスクリプト貼ってくださいpart2」の 253 さんにミリ秒と整数秒の計算がいい加減だった部分を修正していただいています。253 さんには改めて感謝申し上げます。
iDust関数がHC Encoder v0.18で使えない件
2 ちゃんねる DTV 板の Avisynth スレッドにおいて、HCENC018(HC Encoder v0.18) で iDust 関数が使えないという話が出ていたので、ちょっと試してみました。
iDust 関数とは
niiyan's blog :: myFunctions: iDust関数と下記の説明を参照。
テスト結果
フィルタ適用前(ソース)
ビデオクリップ(AVI, Huffyuv, YUY2)を AviSource フィルタで開き、スクリプトの最後で「ConvertToYV12(interlaced=true)」した AVS ファイルを、VirtualDub 1.6.15 で開いたところ。
iFilter(フィールド別フィルタリング)
SeparateFields()
even = SelectEven()
odd = SelectOdd()
even = even.PixieDust() # PixieDust 1回目
odd = odd.PixieDust() # PixieDust 2回目
Interleave(even, odd)
Weave()
SeparateFields で分離したフィールドそれぞれに PixieDust フィルタを適用したあと、再度、フレーム結合した場合。結果は、片方のフィールドが、先頭のフレームのそれに、すべて置き換えられてしまう(下図参照)。
iDust(フィールド別フィルタリング + Dust 対策)
DustV5プラグインのコピーを別のディレクトリに用意するかリネームして、別に用意した関数の中で読み込ませます。
SeparateFields()
even = SelectEven()
odd = SelectOdd()
even = even.PixieDust() # PixieDust 1回目
odd = odd._1MoreDust("PixieDust", ...) # _1MoreDustに変更
Interleave(even, odd)
Weave()
function _1MoreDust(...)
{
LoadPlugin("DustV5プラグインのコピー")
PixieDust(...) # PixieDust 2回目
}
フィールド分離して、フィルタ適用後に再結合するところは同じだが、片方のフィールドには、PixieDust を直接使うのではなく、Wrapper 関数(_1MoreDust)を使用。Wrapper 関数の中で DustV5 プラグイン(コピー)を読み込み、2 回目の PixieDust では、優先的にこちらのプラグインが使われるようにする。結果は、一見、問題がないように見える(下図参照)。
HC Encoder でエンコードすると
上述の iDust 適用後の AVS ファイルを HC Encoder v0.18 でエンコードしてみました(interlacedをオンに、フィールドオーダーをTFFにした以外は、設定はデフォルトのまま)。
HC Encoder v0.18 で出力した MPEG-2 ファイルを、AviUtl 0.98d(MPEG-2 VIDEO VFAPI Plug-In)で開いたところ。iFilter を適用したのと同じような状態になっている。
その他のエンコーダでは?
ためしに同じ AVS ファイルを他のエンコーダでもエンコードしてみました。以下、結果のみ掲載しておきます。
- VirtualDub + Huffyuv YV12(ffdshow)(2 フレーム目)
- QuEnc(2 フレーム目)
- CCE Basic(2 フレーム目) ※CCE Basicのみ「ConvertYV12(true)」せず。
一番上は VirtualDub で、下の 2 つは AviUtl で開いたところ。QuEnc の画質が劣るように見えますが、これは短いソースであったことや設定の不備(QuEnc や HCEnc は今回初めて使用したため、使い方がよくわかりませんでした)が関係している可能性があります。
対策
HC Encoder では iDust 関数を使わないほうがいいようです。対処法は、今のところありません。代わりに、以下のような方法が考えられます(動作を保証するという意味ではありません)。
- 中間ファイルを作成する。
- iDustB関数 を使う。
- ViewFields と UnViewFields を使う。
- JDL_UnfoldFieldsVertical と JDL_FoldFieldsVertical を使う。
- HC Encoder 以外のエンコーダを検討する。
高橋メソッド風の動画を生成する AviSynth スクリプト(JScript 併用版)
高橋メソッド風のAviSynthスクリプトの改訂版です。JScript を利用して、1 から書き直しました(動作には、warpsharp プラグインが必要)。
今回のバージョンでは、改行を区切りとして 1 行ごとにテキストを表示するため、前のバージョンのようにテキストファイルを整形する必要がありません。
詳しくは、同梱されている readme_takahashiMethodMovie.txt を参考にしてください。
ダウンロード
サンプル動画





