Encommander @ wiki プロセス内の計算式・代入変数について


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

プログラム実行時に入力ソースを指定した時点で、入力ソースをmediainfoで解析が実行され、それで得た様々な動画パラメータを、#名称# という記述方式の代入変数により、エンコーダーのオプションに繰り入れる事ができます。
さらに<Pre>と<Command>タグ内に計算式を記述する事により、代入変数も利用した様々な計算式でオプション数値を動的に決定する事が可能です。

<Pre>タグの記述

例えば・・・
<Pre>BR = #V_BitRate#</Pre>
のように記述します。=前後の半角スペースは入れても入れなくOKです。=の左側が変数名、右側が変数に入れられる計算式です。この場合、「BR」という変数が新たに作られ、入力動画のビデオストリームのビットレートが入れられた事になります。「#V_BitRate#」というのは、入力動画の解析から自動的に得られる代入変数の一つです。詳しくはリファレンスを。
次の例。
<Pre>
BR = #V_BitRate#
MBR = #BR#*1.5
</Pre>
<Pre>タグ内は上から下に向かって処理が進むので、まず「BR」にビデオのビットレートが入り、次に「MBR]という変数にその1.5倍の数値が入ったことになります。
記述方の注意事項ですが、上記の場合
<Pre>BR = #V_BitRate#
MBR = #BR#*1.5</Pre>
このように書いてもOKですが、
<Pre>
 BR = #V_BitRate#
 MBR = #BR#*1.5
</Pre>
これはNGです。問題は半角スペース。上記の場合、MBRの方は行頭が半角スペースなので前行のBR計算式の続きとして処理されてしまいます。つまり内部では
BR=#V_BitRate# MBR = #BR#*1.5
という処理となり、エラーになります。<Pre>タグ内は左詰めで記述してください。

他の例も挙げてみます。
TIME = secoftime("#Duration#")
この場合の「#Duration#」というのは、「#V_BitRate#」同様、入力動画から得られる動画の長さ(時間)を示します。そして、「secoftime("~~")」というのは、「HH:MM:SS」という書式の文字列から、総秒数を計算する、このプログラムのオリジナル関数です。
「#Duration#」というのは文字列が入ってくるので、両側を「"」記号で括ってあげる必要があります。プログラミングに慣れた人には逆に違和感を感じるかもしれませんが、内部で先に代入されてから計算が起こるのでこうなります。ご注意を。

<Command>タグ内の計算記述

上記の<Pre>で得られた変数や、入力動画の代入変数を利用して記述できます。また、{{~~}}という記述により<Command>内でも直接計算式を埋め込む方法もあります。例えば
ffmpeg -i "#InputFile#" -b {{ int( V_BitRate / 2 ) }} ・・・
とした場合、まず入力ファイルが「#InputFile#」で指定され、-bオプションは入力動画のビットレートの半分を小数点以下切捨ての整数で指定してます。ちょっと応用例として・・・
ffmpeg -i "#InputFile#" -b {{ int( #V_Width# * #V_Height# * 6 ) }} ・・・
この例では、-bオプションの数値を入力ソースの解像度によりビットレートが決定される計算式を示します。上記の場合はピクセルレート6bps、VGAソースなら約1.8Mbps、QBGAだと450kbps程度となります。

入力動画から得られる代入変数として利用可能なステータスのリストはリファレンスにも載せてありますが、以下の手順で実際に確認した方がわかり易いかもです。
  • 実行ファイル「Encommander.vbs」アイコンに動画をドラッグ
  • スクリプト選択メニューで「i」を入力し「OK」ボタンを押す
  • ダイアログでその動画のパラメータ一覧が表示され、同時に本体ファイルの入っているフォルダ内に「mediainfo.log」というファイルに記録される
  • 適当なテキストビューアで開く

<Pre>タグ内や{{ }}内の計算式については、通常の算術演算子(+ - * / ^ )や比較演算子(=<>)、論理演算子(not and or等)文字列演算子(& "" )、代入記号(=)や括弧類が使え、更にVBScriptで利用可能な関数ならほぼ利用できる・・・と思います;。

注意事項:動画によってMediainfoで取得できるパラメータにはバラつきがあり、取得できなかった場合はステータスが空欄となります。空欄のパラメータを##変数で抽出しようとすると、抽出できなかったという意味での"??"が代入されてきます。その後のエンコードがどのような挙動となるかはわかりませんので、取得できない場合を考慮して、Pre計算でコマンド処理をしておく事をお勧めします。

具体的な応用例

初期テキストを例にして解説します。

<Title>CROP:黒帯オートカット</Title>
<Choose>ダウンロード;レター</Choose>
<Pre>
ct = if_( #V_CropTop# > 0, "-croptop " &Even( #V_CropTop# )&" ", "" )
cb = if_( #V_CropBottom# > 0, "-cropbottom " &Even( #V_CropBottom# )&" ", "" )
asp = round( #V_Width#/( #V_Height#-#V_CropTop#-#V_CropBottom# )*#V_PAR#,3 )
vw = min( #V_Width#, 640 )
vh = min( Even( #V_Height# - #V_CropTop# - #V_CropBottom# ), 480 )
s = if_( #vw# = #V_Width#, "", "-s #vw#x#vh# " )
ab = min( 128,int( #A_BitRate# /1024 ) )
</Pre>
<Command>
ffmpeg.exe -y -i "#InputFile#" -vcodec mpeg4 -qscale 5
 #ct##cb##s#-aspect #asp# -acodec libfaac -ab #ab#k
 -threads 8 "#OutPath##FileName#.mp4"
</Command>


<Pre>計算内

ct = if_( #V_CropTop# > 0, "-croptop " &Even( #V_CropTop# )&" ", "" )
代入変数「#V_CropTop#」の中身が0以上なら「-croptop **」という文字列が入ります。
V_CropTopは奇数の可能性もあるので、切捨ての偶数にしてあります。

cb = if_( #V_CropBottom# > 0, "-cropbottom " &Even( #V_CropBottom# )&" ", "" )
V_CropTopと同じく。

asp = round( #V_Width#/( #V_Height#-#V_CropTop#-#V_CropBottom# )*#V_PAR#,3 )
クロップされた動画のアスペクト(DAR)は、
 [元動画のDAR]×[クロップ前Height]÷[クロップ後Height]
もしくは
 [出力動画のSAR]×[入力動画のPAR]
で得られる事になるんですが、計算式の短い後者を選びました。
「round(~,3)」で、小数点以下3桁にしてあります。

vw = min( #V_Width#, 640 )
動画の横幅を640に制限する、という意味です。元動画が641以上なら640に圧縮、640以下なら横幅は入力動画と同じになります。

vh = min( Even( #V_Height# - #V_CropTop# - #V_CropBottom# ), 480 )
横幅同様に縦幅480に制限する、という意味です。制限しない場合元動画のクロップ後の縦幅が入ります。

s = if_( #vw# = #V_Width#, "", "-s #vw#x#vh# " )
せっかく算出したvwとvhだけど、そもそも横幅が640以下ならサイズ指定しなくても良いんで、「-s」オプションを使うかどうかという判定をしています。

ab = min( 128,int( #A_BitRate# /1024 ) )
出力オーディオビットレートは元動画のオーディオビットレートを使うけど128kに制限しよう、という意味です。「/1024」の意味は、次の<Command>タグ内のffmpegオプションを「k」で指定してるからで、別に深い意味はありません。ffmpegのオプションの「k」を外して、
ab = min( 131072,int( #A_BitRate# ) )
としても結果は同じですね。131072じゃなくて128000にしたければそれでも良いし。

<Command>タグ内

#ct##cb##s#-aspect #asp# ・・・
ここがどうしてこんな書き方かと言うと、「ct」と「cb」と「s」はもしかして空欄("")かもしれないので、代入後に変な半角スペースが入らないようにしてあります。でも「asp」は必ず数値が入ってるので、こういう書き方になります。