ShowTimeCode のバックアップの現在との差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#contents

* 説明 [#x7919c22]

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

AviSynth 内蔵の Subtitle フィルタを使用する ShowTimeCode と、SubtitleEx プラグイン([[AviSynth Filter Collection:http://avisynth.org/warpenterprises/]] から入手可能)を使用する ShowTimeCodeEx の 2 つがあります。
AviSynth 内蔵の Subtitle フィルタを使用する ShowTimeCode と、SubtitleEx プラグイン([[AviSynth Filter Collection:http://avisynth.nl/warpenterprises/]] から入手可能)を使用する ShowTimeCodeEx の 2 つがあります。

''注意:'' AviSynth 内蔵の [[ShowSMPTE>Showframes]] フィルタを使って、この関数と同様の効果を得ることが可能です。

* 作者 [#r6dc5d1b]

-にーやん
-2ちゃんねる「お前らのショボイAvisynthスクリプト貼ってくださいpart2」の 253 さん

* コード [#lcd8abbf]

#code{{
#pre{{
# Use this, when you use internal Subtitle filter
function 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"){
    # Set default values.
    global stc_x = default(x, 8)
    global stc_y = default(y, 18)
    global stc_font = default(font, "Arial")
    global stc_size = default(size, 18)
    global stc_text_color = default(text_color, $FFFF00)
    global stc_halo_color = default(halo_color, $000000)
    global stc_align = default(align, 4)
    global stc_spc = default(spc, 0)
    global stc_mode = default(mode, "hh:mm:ss:ms")
    global stc_ms_digit = default(ms_digit, 2)
    offset = default(offset, 0.0)
    nowtime = default(nowtime, false)
   
    # Throw error when ms_digit isn't between 1 and 3.
    Assert((stc_ms_digit>=1)&&(stc_ms_digit<=3), "Error: ms_digit must be between 1 and 3.")
   
    # Get the current system time.
    system_time = (nowtime == true) ? Int(Value(Time("%H")))*60*60 +
    \ Int(Value(Time("%M")))*60 + Int(Value(Time("%S"))) : NOP
   
    # If nowtime is true, add system_time as offset.
    global stc_offset = (nowtime == true) ? offset + system_time : offset
   
    # Evaluate time in each frames (in seconds) and show as GetTimeCode's format.
    return ScriptClip(c, "get_time = (current_frame)/FrameRate()" +
    \ "total_time = GetTimeCode(get_time, stc_offset, stc_mode, stc_ms_digit)" +
    \ "Subtitle(total_time, stc_x, stc_y, current_frame, current_frame,
    \ stc_font, stc_size, stc_text_color, stc_halo_color, stc_align, stc_spc)")
}

# Use this, if you want to use SubtitleEx plugin
function ShowTimeCodeEx(clip c, int "x", int "y", string "font",
\ string "effects", int "size", int "textcolor", int "halocolor",
\ float "offset", bool "nowtime", string "mode", int "ms_digit"){
    # Set default values.
    global stcex_x = default(x, Round(-Width(c)*0.11))
    global stcex_y = default(y, Round(-Height(c)*0.17))
    global stcex_font = default(font, "Arial")
    global stcex_effects = default(effects, "b")
    global stcex_size = default(size, 36)
    global stcex_textcolor = default(textcolor, $00FFFFFF)
    global stcex_halocolor = default(halocolor, $00000000)
    global stcex_mode = default(mode, "hh:mm:ss:ms")
    global stcex_ms_digit = default(ms_digit, 2)
    offset = default(offset, 0.0)
    nowtime = default(nowtime, false)
   
    # Throw error when ms_digit isn't between 1 and 3.
    Assert((stcex_ms_digit>=1)&&(stcex_ms_digit<=3), "Error: ms_digit must be between 1 and 3.")
   
    # Get the current system time.
    system_time = (nowtime == true) ? Int(Value(Time("%H")))*60*60 +
    \ Int(Value(Time("%M")))*60 + Int(Value(Time("%S"))) : NOP
   
    # If nowtime is true, add system_time as offset.
    global stcex_offset = (nowtime == true) ? offset + system_time : offset
   
    # Evaluate time in each frames (in seconds) and show as GetTimeCode's format.
    return ScriptClip(c, "get_time = (current_frame)/FrameRate()" +
    \ "total_time = GetTimeCode(get_time, stcex_offset, stcex_mode, stcex_ms_digit)" +
    \ "SubtitleEx(total_time, stcex_x, stcex_y, current_frame, current_frame,
    \ stcex_font, stcex_effects, stcex_size, stcex_textcolor, stcex_halocolor)")
}

# Used inside ShowTimeCode/ShowTimeCodeEx
function GetTimeCode(float get_time, float offset, string mode, int ms_digit){
    # Calculate mili-seconds and convert to string.
    factor = Pow(10, ms_digit) # 小数点以下を繰り上げするための倍数(10 の ms_digit 乗)
    ms_int = Round(get_time*factor) % Int(factor) # get_time の factor 倍したものを factor で割った余り
    ms = String(ms_int, "%0"+String(ms_digit)+".0f") # 書式指定して文字列型に変換
   
    # Calculate integer seconds
    int_time = Round(get_time-(Value(ms)/factor)) # 元の時間から小数点以下を引いた数を丸める
   
    # Calculate seconds and convert to string.
    ss = String(int_time%60)
    ss = RightStr("0" + ss, 2)
   
    # Calculate minutes and convert to string.
    mm = String((int_time/60)%60)
    mm = RightStr("0" + mm, 2)
   
    # Calculate hours and convert to string.
    hh = ((int_time/60)/60)%60
    hh_multiplier = hh/24
    hh = (hh >= 24) ? hh - (24*hh_multiplier) : hh
    hh = (hh < 10) ? "0" + String(hh) : String(hh)
   
    # Decide what kind of mark is used as separation, when showing ms.
    separation = (RightStr(mode, 2) == "ms") ? LeftStr(RightStr(mode, 3), 1) : NOP
   
    # Generate timecode.
    timecode =
    \ (mode == "ts") ? String(int_time) :
    \ ((mode == "ts.ms")||(mode == "ts:ms")) ? String(int_time) + separation + ms :
    \ (mode == "ss") ? ss :
    \ ((mode == "ss.ms")||(mode == "ss:ms")) ? ss + separation + ms :
    \ ((mode == "mm:ss.ms")||(mode == "mm:ss:ms")) ? mm + ":" + ss + separation + ms :
    \ ((mode == "hh:mm:ss.ms")||(mode == "hh:mm:ss:ms")) ?
    \ hh + ":" + mm + ":" + ss + separation + ms :
    \ (mode == "mm:ss") ? mm + ":" + ss :
    \ (mode == "hh:mm:ss") ? hh + ":" + mm + ":" + ss :
    \ "Invalid"
   
    Assert(timecode != "Invalid" , """Error: such "mode" doesn't exist.""")
   
    # Return time code as string.
    return timecode
}
}}

* シンタックス [#b0612ac5]

** ShowTimeCode [#nd1edd5b]

#code{{
#pre{{
function 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")
}}

** ShowTimeCodeEx [#h23ab875]

#code{{
#pre{{
ShowTimeCodeEx(clip c, int "x", int "y", string "font",
\ string "effects", int "size", int "textcolor", int "halocolor",
\ float "offset", bool "nowtime", string "mode", int "ms_digit")
}}

*  パラメータ [#pded2c99]

** Subtitle フィルタと同じ働きをするパラメータ [#d43b2852]

-c: ビデオクリップ
-x, y: タイムコードの表示位置(x-y 座標)。
-font: フォント。
-size: フォントの大きさ。
-text_color: フォントの色。
-halo_color: フォントの縁の色。

** ShowTimeCode / ShowTimeCodeEx で追加されたパラメータ [#z3077aad]

-offset: オフセット。デフォルト: 0.0。
-nowtime: システム時間を取得するかどうか。デフォルト: false。
-mode: 表示モード。以下のいずれか:
--"ts"
--"ts.ms" または "ts:ms"
--"ss"
--"ss.ms" または "ss:ms"
--"mm:ss.ms" または "mm:ss:ms"
--"hh:mm:ss.ms" または "hh:mm:ss:ms"(デフォルト)
--"mm:ss"
--"hh:mm:ss"
-ms_digit: ミリ秒単位において表示する桁の数。デフォルト: 2。

** ShowTimeCode のみ [#s044d0b0]

-align: デフォルトの表示位置。Subtitle フィルタの align。
-spc: フォントの間隔。Subtitle フィルタの spc。

** ShowTimeCodeEx のみ [#cc4a788e]

-effects: SubtitleEx の effects(デフォルト: "b")。
--"b" - 太字
--"i" - イタリック体
--"u" - アンダーライン
--"c" - 中央寄せ
--"s" - ソフトぼかし
--"g" - ガウシアンぼかし
--"e" - エンボスフィルタ
--"l" - ラプラシアンフィルタ(エッジ検出)

* 使用例 [#xaacc15f]

#code{{
#pre{{
BlankClip(46, 448, 336, "YV12", fps=15)
ShowTimeCode(x=Width()/2, y=Height()/2, font="7barP", size=48, align=5, ms_digit=3)
}}

** 動画サンプル [#v4df2b0d]

#htmlinsert(zoome,id=de3d1686fffdf7f5db4410227ae5ae3c72836cd15f5624817a686864b343d4356355284803e1cad10c41676483d24447f9f1976f)

-[[zoome動画: タイムコード表示関数ShowTimeCodeのサンプル - niiyan X zoome:http://zoome.jp/niiyan/diary/5/]]

* 関連ページ [#c00d5056]

-[[にーやんのブログ :: ShowTimeCode - タイムコードを表示する関数:http://niiyan.s8.xrea.com/blosxom/avisynth/function/20051106-showtimecode-function.htm]]
-[[にーやんのブログ :: ShowTimeCodeEx: SubtitleExプラグインを使用したタイムコード表示関数:http://niiyan.s8.xrea.com/blosxom/avisynth/function/20051109-showtimecodeex-function.htm]]
-[[お前らのショボイAvisynthスクリプト貼ってくださいpart2:http://pc11.2ch.net/test/read.cgi/avi/1153487392/]]
-[[ShowSMPTE>Showframes]]