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

スポンサード リンク

ShowTimeCode - タイムコードを表示する関数

AviSynth Wiki - ShowTimeCode にページを設置しました。最新の情報およびダウンロードは、AviSynth Wiki - ShowTimeCode を参照してください。


2ちゃんねるの AviSynth スレッド Part 20 で「動画にタイマーをつけた」いという話が出ていました。そういえば、以前、そのような関数を書いたなと思って過去ログを漁ってみたらありました。

Avisynthを絶賛ιょぅょ Part15
228 名前: ◆NIiYaNiQWc :03/12/16 23:41
>>197
# ShoboInfo()(仮)
#
# 別件で考えていたものを手直し。一応動く程度

別件というのが何なのかは書いた本人にもわかりませんが、この関数を少し手直したものを作ってみました。

(2006-02-11 追記)タイムコードの表示には、AviSynth 内蔵の ShowSMPTE フィルタを利用することもできます。ShowSMPTE フィルタの方が動作が軽く、AviSynth 2.5.6 以降なら Subtitle フィルタのオプションを使用することも可能です。

概要

ShowTimeCode は、タイムコードを表示する関数です。フレームレートと現在のフレーム番号から時間を計算して、クリップ上に表示します。実際のタイムコードとは、若干の誤差が生じる可能性があります。

2005-11-09 版から、ShowTimeCodeEx 関数を同梱しています。ShowTimeCodeEx については、にーやんのブログ :: ShowTimeCodeEx: SubtitleExプラグインを使用したタイムコード表示関数を参照。

また、2006-02-11 版での変更点については、にーやんのブログ :: ShowTimeCode 関数を更新を参照。

ダウンロード

AviSynth Wiki - ShowTimeCode を参照。

使用方法

ShowTimeCode.avs をメインのスクリプトにインポートして、使用してください。詳しくは、下記の使用例を参考にしてください。

なお、ShowTimeCode.avs の中には ShowTimeCode の補助関数 GetTimeCode が含まれていますが、GetTimeCode は単独では使用できません。

書式

ShowTimeCode(clip c, int "x", int "y", string "font", int "size",
\ int "text_color", int "halo_color", int "align", int "spc",
\ float "offset", bool "nowtime", string "mode", int "ms_digit")

引数

  • x, y: タイムコードの表示位置(x-y 座標)。
  • font: フォント。
  • size: フォントの大きさ。
  • text_color: フォントの色。
  • halo_color: フォントの縁の色。
  • align: デフォルトの表示位置。Subtitle フィルタの align。
  • spc: フォントの間隔。Subtitle フィルタの spc。
  • offset: オフセット。
  • nowtime: システム時間の取得。
  • mode: 表示モード。
  • ms_digit: ミリ秒単位において表示する桁の数。

offset、nowtime、mode、ms_digit については、にーやんのブログ :: ShowTimeCode 関数を更新を参照。それ以外は、AviSynth 内蔵の Subtitle フィルタの引数と同じです。

使用例1: 引数を省略した場合

スクリプト
Import("ShowTimeCode.avs")
ColorBars(320,240)
ShowTimeCode()
サンプル画像

ShowTimeCodeの使用例1

使用例2: 引数を指定した場合

スクリプト
Import("ShowTimeCode.avs")
ColorBars(320,240)
ShowTimeCode(60,240,"Digital Number",30,$ffffff,$000000,1,30)
サンプル画像

ShowTimeCodeの使用例2

備考

  • AviSynth 2.5.6aで動作確認。
  • 動作無保証。
  • 動作に問題がないようなら、AviSynth Wiki に転載するかもしれません。

(追記) ShowTimeCode.avs と Subtitle フィルタのリンクが間違っていたのを修正しました。


(2005-11-09 追記)

新しいバージョンに差し替えました。変更点は、以下のとおり:

  • ShowTimeCode: 引数の順番を「..., int "size", string "font", ...」から「..., string "font", int "size", ...」に変更(Subtitleフィルタに合わせるため)。
  • ShowTimeCode: 内部の変数を「ts_*」から「stc__*」に変更。
  • ShowTimeCodeEx 関数を追加。SubtitleEx プラグインを使用するバージョンです。

(2006-02-11 追記)

(2007-10-01 追記)

  • 2007-10-01: FTP アップロード時に改行コードが変更されるため、ZIP 形式での配布に変更した(バッチファイルの内容に変更はありません)。

(2008-03-22 追記)

  • 2008-03-22: AviSynth Wiki - ShowTimeCode にページを設置しました。これにともない、このページのダウンロードリンクを削除しました。

mojimoji 関数: テキストの移動と拡大縮小

SubtitleとAnimateを組み合わせてテキストを移動させるでは、Subtitle と Animate を組み合わせて、テキストを移動させたり、拡大縮小させたりする方法を紹介しました。

その方法では引数の指定が面倒だったので、今回、これを関数化してみました。名付けて、mojimoji 関数。

ダウンロード

mojimoji 関数のダウンロード(2008-04-08 更新)

シンタックス

mojimoji
mojimoji(clip input, string moji, int start, int end, int x1, int y1, int "x2", int "y2", int "size",
\ string "font", int "text_color", int "halo_color", int "size2", int "lsp")
mojimojiOvr
mojimojiOvr(clip input, string moji, string "fx", string "fy", string "fopacity", string "fzoom",
\ int "size", string "font", int "text_color", int "halo_color", int "x", int "y", float "opacity")

パラメータ

共通
  • input: ビデオクリップ。
  • moji: 表示するテキスト。
  • size: テキストの標準サイズ。
  • font: 使用するフォント。
  • text_color: テキストの色。
  • halo_color: テキストの縁の色。
mojimoji のみ
  • start: 開始フレーム。
  • end: 終了フレーム。
  • x1: start 時点におけるテキストの x 座標。
  • y1: start 時点におけるテキストの y 座標。
  • x2: end 時点におけるテキストの x 座標。
  • y2: end 時点におけるテキストの y 座標。
  • size2: end 時点におけるテキストのサイズ。拡大縮小時のみ指定。
  • lsp: 行間の高さ。Subtitle の同名パラメータに相当。
mojimojiOvr のみ
  • fx: Overlay フィルタの ol_x_offset を定義した ConditionalReader 形式のファイル。
  • fy: Overlay フィルタの ol_y_offset を定義した ConditionalReader 形式のファイル。
  • fopacity: Overlay フィルタの ol_opacity_offset を定義した ConditionalReader 形式のファイル。
  • fzoom: 文字サイズを定義した ConditionalReader 形式のファイル。
  • x: テキストの x 座標。fx を使わず、位置を固定したい場合に指定。
  • y: テキストの y 座標。fy を使わず、位置を固定したい場合に指定。
  • opacity: 不透明度。fopacity を使わず、不透明度を固定したい場合に指定。

mojimoji.avs 内で設定可能な global 変数

mojimoji.avs の中で、以下の global 変数の値を設定/変更することができます。

# デフォルト値の指定
global mojimoji_text_color = $000000 # フォントの色
global mojimoji_halo_color = $EFEFEF # 文字の縁、および、文字を重ねるクリップの背景色
global mojimoji_font = "MS Pゴシック" # フォント
global mojimoji_size = 18 # フォントの大きさ
global mojimoji_lsp = 0 # 複数行表示時の行間の大きさ(-1 なら常に 1 行として扱う)
global mojimoji_mask_tolerance = 10 # マスクの許容度(大きくするほど、より多くの色を透過色とみなす)

font_color, halo_color, font, size, lsp を省略した場合には、上の 4 つの値がそれぞれ適用されます。最後の mojimoji_mask_tolerance は同じ色とみなす許容範囲を指定する。ColorKeyMask の tolerance パラメータに相当。

使用例

mojimoji
# 関数定義ファイルのインポート
Import("mojimoji.avs")
# ソースクリップ
BlankClip(100, 320, 240, fps=15, color=mojimoji_halo_color)
# 右から左へ
mojimoji("               ∧∧\n   ┃   ┏━┃     (,,゚∀゚)     ┃┃\n ━┏┛ ┏━┃ ━━/ つ━━┛ .┃┃\n ━┏┛ ┛  ┃   ~( ,ノつ      ┛┛\n   ┛       ┛     (/        .┛┛", 0,24, 320,80, -320,80)
# 下から上へ
mojimoji("               ∧∧\n   ┃   ┏━┃     (,,゚∀゚)     ┃┃\n ━┏┛ ┏━┃ ━━/ つ━━┛ .┃┃\n ━┏┛ ┛  ┃   ~( ,ノつ      ┛┛\n   ┛       ┛     (/        .┛┛", 25,49, 0,240, 0,-240)
# 拡大
mojimoji("               ∧∧\n   ┃   ┏━┃     (,,゚∀゚)     ┃┃\n ━┏┛ ┏━┃ ━━/ つ━━┛ .┃┃\n ━┏┛ ┛  ┃   ~( ,ノつ      ┛┛\n   ┛       ┛     (/        .┛┛", 50,98, 150,120, -400,-40, 1, size2=64)

zoome動画: mojimoji.avs サンプル動画 1: mojimoji - niiyan X zoome

mojimojiOvr
# 関数定義ファイルのインポート
Import("mojimoji.avs")
# ソースクリップ
BlankClip(100, 320, 240, fps=15, color=mojimoji_halo_color)
# mojimojiOvr 関数
mojimojiOvr("キタ━(゚∀゚)━!", "xoffset.txt", "yoffset.txt", "opacity.txt", "zoom.txt")

※注: "xoffset.txt", "yoffset.txt", "opacity.txt", "zoom.txt" は、サンプルとして mojimoji.avs に同梱されています。

zoome動画: mojimoji.avs サンプル動画 2: mojimojiOvr - niiyan X zoome

関連記事

更新履歴

  • 2005-10-22: 初版。
  • 2007-10-23: ZIP 形式で圧縮したものに差し替え。内容は変更なし。

CopyFieldCond関数(2): フィルタ適用前のフィールドと置換可能に

CopyFieldCond 関数を少しいじってみました。

前回のスクリプトは CopyField 関数の拡張版ということで、あるフィールドを別のフィールドに置き換えるものでした。今回の修正で、フィルタ適用後のあるフィールドをフィルタ適用前の別のフィールドに置き換えることができるようになりました・・・たぶん。

そもそも前のバージョンがちゃんと動くかどうかもわからない状態なので、今回のも意図したとおりに動作しない可能性があります。よって動作無保証です。

CopyFieldCond関数(改)

function CopyFieldCond(clip clip, string logfile, bool "debug", bool "show_result", string "filter")
{
# デフォルト値などの指定
debug = default(debug, false) # debugのデフォルトはfalse
show_result = default(show_result, false) # debugのデフォルトはfalse
filter = default(filter, "") # filterのデフォルトは""
global FreezeThis = -1 # これは変更しないこと
global video = clip.SeparateFields() # フィールド分離

# filter指定があればfilterを適用してフィールド分離、さもなければvideo
filtered = (filter != "") ? Eval("clip." + filter).SeparateFields() : video

# debug==true&show_result==falseの場合: フレーム番号の表示
video = ((debug == true) && (show_result == false)) ?
\ video.ScriptClip("Subtitle(String(current_frame))") : video

# ScriptClip: フレームごとに評価
copy = video.ScriptClip("FreezeFrame(current_frame, current_frame, FreezeThis)")

# ConditionalFilter/ConditonalReader: FreezeThisが-1より大きいならcopyから取る
ConditionalFilter(video, copy, filtered, "FreezeThis", ">", "-1")
ConditionalReader(logfile, "FreezeThis", false)

# debug==true&show_result==falseの場合: フレーム番号の表示
((debug == true) && (show_result == true)) ?
\ ScriptClip("Subtitle(String(current_frame))") : last

# debug==trueの場合: 各フィールドを選択
even = ((debug == true) && (show_result == false)) ? video.SelectEven() :
\ ((debug == true) && (show_result == true)) ? SelectEven() : NOP
odd = ((debug == true) && (show_result == false)) ? video.SelectOdd() :
\ ((debug == true) && (show_result == true)) ? SelectOdd() : NOP

# debug==trueなら2画面分割表示、さもなければWeave
(debug == true) ? StackVertical(even, odd) : Weave()
}

使用例1: 通常モード(フィルタなし)

CopyFieldCond("CopyFields.txt")

前回と同じ。

!通常モード(フィルタなし)
大きい画像

使用例2: デバッグモード(フィルタなし/フィールド入れ替え前)

CopyFieldCond("CopyFields.txt", true) # または debug=true

前回と同じ。

!デバッグモード(フィルタなし/フィールド入れ替え前)
大きい画像

使用例3: デバッグモード(フィルタなし/フィールド入れ替え後)

CopyFieldCond("CopyFields.txt", true, true)

!デバッグモード(フィルタなし/フィールド入れ替え後)
大きい画像

「show_result=true」なら入れ替え後の状態を表示(debug=true 時のみ)。

使用例4: 通常モード(フィルタあり)

CopyFieldCond("CopyFields.txt", filter="GreyScale()") # filter=でフィルタ指定

!通常モード(フィルタあり)
大きい画像

使用例5: デバッグモード(フィルタあり/フィールド入れ替え前/フィルタ適用前)

CopyFieldCond("CopyFields.txt", true, filter="GreyScale()")

使用例2と同じ。

使用例6: デバッグモード(フィルタあり/フィールド入れ替え後/フィルタ適用後)

CopyFieldCond("CopyFields.txt", true, true, "GreyScale()")

!デバッグモード(フィルタあり/フィルタ適用後)
大きい画像


(追記)フィルタ(filter)はフィールド分離前のクリップに適用されます。

CopyFieldCond関数: ConditionalFilterを利用したCopyField拡張版

昨日あたりから、2ちゃんねる DTV 板の Avisynth スレッドで、「あるフィールドを別のコピーしたフィールドに入れ替える方法」に関する話題が出ていたので、HowToApplyFilterToManySingleFrames を使って CopyField 関数の拡張版を作ってみました。

HowToApplyFilterToManySingleFrames は、ConditionalFilterConditionalReader を使って、たくさんの単一フレームにフィルタをかけるテクニックです(AviSynth 開発者の sh0dan 氏が提案したもの)。にーやんのブログ :: HowToApplyFilterToManySingleFrames でも紹介していますので、参考にしてください。

CopyFieldCond関数

function CopyFieldCond(clip clip, string logfile, bool "debug")
{
# デフォルト値などの指定
global video = clip.SeparateFields() # フィールド分離
global FreezeThis = -1 # これは変更しないこと
debug = default(debug, false) # debugのデフォルトはfalse

# debug==trueの場合: フレーム番号の表示と各フィールドの選択
video = (debug == true) ? video.ScriptClip("Subtitle(String(current_frame))") : video
even = (debug == true) ? video.SelectEven() : NOP
odd = (debug == true) ? video.SelectOdd() : NOP

# ScriptClip: フレームごとに評価
copy = video.ScriptClip("FreezeFrame(current_frame, current_frame, FreezeThis)")

# ConditionalFilter/ConditonalReader: FreezeThisが-1より大きいならcopyから取る
ConditionalFilter(video, copy, video, "FreezeThis", ">", "-1")
ConditionalReader(logfile, "FreezeThis", false)

# debug==trueなら2画面分割表示、さもなければWeave
(debug == true) ? StackVertical(even, odd) : Weave()
}

使い方

1.ログファイル(例: CopyFields.txt)を作成。ログファイル内には、以下の 2 行を記述。

type int
default -1

2.CopyFieldCond を debug モードで使用。debug モードでは、フィールド別に上下 2 画面表示になり、各フィールドの番号が表示されます。

# 例
AviSource("foo.avi") # ソース
AssumeFrameBased().ComplementParity() # フィールドオーダーの指定
CopyFieldCond("CopyFields.txt", true) # debug=trueならdebugモード

3.「コピー先フィールドNo コピー元フィールドNo」の形式で、ログファイルに追記していく。

# 例
type int
default -1
2 4
4 6

4.debug モードを解除。

AviSource("foo.avi") # ソース
AssumeFrameBased().ComplementParity() # フィールドオーダーの指定
CopyFieldCond("CopyFields.txt") # または CopyFieldCond("CopyFields.txt", false)

使用例

  • オリジナル:

オリジナル

オリジナルの大きい画像

  • debug モード:

debug

  • フィルタ適用後:

!フィルタ適用後

フィルタ適用後の大きい画像

補足

簡単な動作テストはしていますが、いつものように動作無保証です。ログファイルを作成する手間などを考えると、あまり実用的とは言えないかもしれません。

範囲指定も可能です(正常に動作するかどうかは別にして)。範囲指定したい場合は、ログファイルに次のように記述します。

#  1~2フィールドを3フィールド目に置き換える
R 1 2 3

# 4~5フィールドを5~6フィールドに置き換える
I 4 5 5 6

オリジナルの CopyField 関数は、アーカイブ: 旧AviSynthのぺーじにあります。徐々にではありますが、このページにあるユーザー定義関数についても、AviSynth Wiki へ移行させていきたいと考えています。


(追記)にーやんのブログ :: CopyFieldCond関数(2): フィルタ適用前のフィールドと置換可能にに新しいバージョンを掲載しています。

続々・高橋メソッド風なAviSynthスクリプト

高橋メソッド風なAviSynthスクリプトを更新しました。

大きな変更点は、次の2点です。

  • 外部音声との合成(BGMの追加)を可能にした。
  • 一般的なテキストデータを、定義ファイルの形式に変換するためのバッチファイル(Txt2TakahashiMethod.bat)を同梱。

これまでの定義ファイルは、

global _1="あskpkjごpjh@"

といったように書かなければなりませんでしたが、バッチスクリプトを利用すれば、

あskpkjごpjh@

と書いたtxtファイルを、上の形式に変換することができます。

ダウンロードは、にーやんのブログ :: 高橋メソッド風のAviSynthスクリプトからお願いします。

Page 3 of 8: « 1 2 3 4 5 6 7 8 »