Subtitle フィルタにとって -1 は魔法の値
Subtitle フィルタで x と/または y の値を -1 に設定すると自動的に中央揃えされるという話。少し古いネタですが、整理していたら出てきたのでメモ。
IanB 氏曰く、この -1 は「魔法の値」だそうです。
What is causing a glitch at frame 294 in my script? - Doom9's Forum
Originally Posted by documentation
... The parameters x and y can be set to -1 to automatically calculate and use the horizontal or vertical center coordinate.
Ahhhgggg magic values
このことは Subtitle フィルタのマニュアルにも書かれていますし、Subtitle 単独で使用する場合にはすぐに気づくと思います。ただし、Subtitle を Animate などと組み合わせて使用する際には、意図せず x と/または y に -1 が入ってしまうケースもあるかと思います(逆に偶然 -1 が入らないケースもあるでしょう)。
例
BlankClip(5, 320, 240)
Animate(0, 4, "Subtitle", "'-1' is a magic value.",2,-1, "'-1' is a magic value.",-2,-1)
このスクリプトを VirtualDub や AvsP を使ってコマ送りしてみてください(5 フレームしかないので、再生すると一瞬で終わってしまいます)。ちょうど x の値が -1 になるフレーム 3 で、テキストが急に中央に移動します。y の値は -1 で固定させていますので、そちらでも -1 がどういう働きをするかを確認できると思います。
対処法
いくつか対処法が考えられます。
- メッセージの頭にスペースを付け足して、-1 よりも大きい値をスキップし、直接 -2 から開始する(What is causing a glitch at frame 294 in my script? - Doom9's Forum より IanB 氏のアイデア)
- ラッパー関数を用意して、x または y が -1 の場合は、0 または -2 にする(完全な解決にはなりませんが、簡単な次善の策として)。
- Animate ではなく、Overlay と ConditionalReader の組み合わせにする(ConditionalReader で ol_x_offset/ol_y_offset を定義して移動させる)。
- 絶対に -1 にならないようにする(例えば、大きめのクリップを用意して最小値が -1 より大きくなるようにし、あとでいらない部分を Crop する、など)。
対処例
2 番目のラッパー関数を使う方法を示します。
まず次のような関数を用意します。
# 簡単な Wrapper 関数の例
function SubtitleWrapperTest(clip input, string moji, int x, int y) {
# x が -1 なら 0 に設定、それ以外ならそのまま
x = (x == -1) ? 0 : x # 0 でなく -2 にしてもよい
# y が -1 なら 0 に設定、それ以外ならそのまま
y = (y == -1) ? 0 : y # 0 でなく -2 にしてもよい
# 新しい x と y を Subtitle の引数に指定
output = input.Subtitle(moji, x, y)
# output 返す
return output
}
ここでは簡略化のために size や font などの設定は省略しています。よって、このままでは実用的ではありません。Animate との併用時にはフォントなどは固定でしょうから、関数の中でデフォルト値を設定してしまってもいいでしょう。
BlankClip(5, 320, 240)
Animate(0, 4, "SubtitleWrapperTest", "'-1' is a magic value.",2,-1, "'-1' is a magic value.",-2,-1)
Subtitle の代わりに用意した関数を指定します。コマ送りしてみると、フレーム 3 で少し停止したような印象を受けるかもしれません。しかし、中央揃えされるよりはいいでしょう。
これはあくまでも回避策ですので、他の方法も試してみてください。ちなみに mojimoji 関数: テキストの移動と拡大縮小の mojimoji ではこのラッパー関数を利用する方法を、mojimojiOvr では 3 番目の Overlay と ConditionalReader を併用する方法を使っています。
関連記事
ラッパー関数について
スポンサード リンク
writeback message: Ready to post a comment.
- [Preview]ボタンをクリックすると、コメント内容をプレビューすることができます(JavaScript使用)。
- スパム対策としてリファラチェックを行っています。セキュリティソフトの設定でリファラを無効にしていると投稿できません。
- エントリの内容と無関係と思われるコメントやトラックバックは削除されます。
- 当ブログへの言及リンクがないトラックバックはブロックされます。



