エンコードに関する設定ではなく、エンコードをより効率的にしようというもの。
参考にしたのは以下のサイトです。
Avisynth + x264 を用いたTSファイルのエンコード - 応用1 : バッチファイルによる下準備の簡略化 (Take-Rのメモ帳)
というか、ほとんどそのまんまです (;^_^A
うちはTMPGEnc MPEG Editor 3でCMカットして、mpgファイルとwavファイルにしていますので、そこからスタートになります。
全体の流れは、
mpgファイルをdgindex.batにドラッグ&ドロップしてDGIndexのプロジェクトファイル(d2v)とAvisynthスクリプトファイル(avs)を作成。
できたavsファイルをenc.batにドラッグ&ドロップしてエンコードとなります。
dgindex.bat
@echo off :: DGIndexのフルパス set DGIndex=E:\encode\dgmpgdec158\DGIndex.exe :: avs_template.avsのフルパス set AvsTemp=E:\encode\avs_template.avs :: encodeフォルダのフルパス(avsファイル格納場所) set EncPath=E:\encode\ :loop :: 入力がなければ:endにジャンプ。 :: 拡張子が".mpg"または".mpg"以外のファイルが入力されたら:errorにジャンプ。 if "%~1"=="" goto end if /i not "%~x1"==".mpg" goto error :: ファイル名+拡張子を画面に表示する。 echo [入力ファイル] %~nx1 :: DGIndexでの解析・抽出。オプションについては付属のManualを参照。 echo processing: start "%DGIndex%" -i "%~1" -o "%~dpn1" -ia 5 -fo 0 -yr 2 -om 0 -minimize -exit >nul echo prosessing: finish :: ログファイルの名前変更 if exist "%~dpn1.log" move /Y "%~dpn1.log" "%~dpn1_DGIndex.log" >nul :: テンプレートのavsファイルを入力ファイル名でコピーした後、:shiftへジャンプ if exist %AvsTemp% ( copy /Y "%AvsTemp%" "%EncPath%%~n1.avs" touch "%EncPath%%~n1.avs" ) echo. goto shift :: エラーメッセージの表示 :error echo [入力ファイルエラー] %~nx1 echo mpgファイルを指定して下さい... echo. :: パラメーターを1つシフトさせてから:loopへ戻る。 :shift shift goto loop :: 一時停止後に終了処理。 :end echo Done... pause exit
上記ののbatファイルにmpgファイルをドラッグ&ドロップすれば(複数可)、DGIndexのプロジェクトファイルとavsファイルができあがります。
ただ、このbatファイルは1箇所、Cygwinを必要とする所があるので注意。Cygwinをインストールしたくない場合は、その箇所を削る必要があります。
できあがったavsファイルは事前に用意してあるテンプレートのavsファイル(avs_template.avs)をmpgファイルと同じ名前でコピーしただけです。
CMカットはTMPGEnc MPEG Editor 3でやっているので、個別にTrim関数を追加する必要はないし、Avisynthで実施する処理はどの動画ファイルでも共通にしてあり、滅多にいじらないのでこうしています。
できあがったavsファイルは、touchコマンドでファイル更新時刻を更新しています。
コピーしただけではファイル更新時刻が更新されず、できあがったavsファイルをファイル更新時刻でソートしたい時にソートできなくなるので。
このtouchコマンドがCygwinを利用している部分になります。
CygwinはデフォルトインストールでOK。touchコマンドのファイルパスを環境変数PATHに登録しておくこと。あとCygwin環境変数にnodosfilewarningを設定しておくと吉。
Cygwinをインストールしたくない場合は、touchコマンドの行を削除する。ファイル更新時刻でソートできなくなるが、どうしても必要というわけではないので。
予め用意しておくテンプレートのavsファイル(dgindex.batファイル中のavs_template.avs)
avs_template.avs
file_name = GetScriptName(false) plugin_path = "E:\encode\avisynth_plugins\" #mpgファイル & wavファイル & d2vファイル格納場所 tvdata_path = "E:\tvdata\" LoadPlugin(plugin_path + "DGDecode.dll") LoadPlugin(plugin_path + "TDeint.dll") LoadPlugin(plugin_path + "TIVTC.dll") LoadPlugin(plugin_path + "EEDI2.dll") LoadPlugin(plugin_path + "warpsharp.dll") MPEG2Source(tvdata_path + file_name + ".d2v") #トップファースト AssumeTFF() #インターレース解除 & 24fps化 TIVTC24P2() Crop(0, 0, 1440, 1080) Spline36Resize(1280, 720) #シャープ WarpSharp(128, 3, 128, -0.6) return last function TIVTC24P2(clip clip){ Interp = clip.AssumeTFF().SeparateFields().SelectEven().EEDI2(field=1) Deinted=clip.TDeint(order=1,field=1,edeint=Interp) clip = clip.TFM(mode=6,order=1,PP=7,slow=2,mChroma=true,clip2=Deinted) clip = clip.TDecimate(mode=1) return clip } # GetScriptName, modified by niiyan # 変更点: ファイル名のみ取得可能にした。 function GetScriptName(bool "fullpath") { avs_path = "E:\encode\" get_fullpath = default(fullpath, true) Try { assert(false) } Catch(err_msg) { err_msg = MidStr(err_msg, FindStr(err_msg, "(") + 1) filename = LeftStr(err_msg, StrLen(err_msg) - FindStr(RevStr(err_msg), ",")) # filename = (get_fullpath == false) ? RightStr(filename, FindStr(RevStr(filename), "\") - 1) : filename filename = MidStr(filename, Strlen(avs_path) + 1) filename = (get_fullpath == false) ? LeftStr(filename, StrLen(filename) - FindStr(RevStr(filename), ".")) : filename return filename } }
ノイズ除去はかけていなく、シャープのみ実施。サイズは1280x720にしています。
他に共通の処理をかけたい場合は適当に追加するとよいです。
GetScriptName関数でavsファイル名を取得して、それとd2vファイル(=mpgファイル)が同名であることを利用して動画データを読み込んでいますので、テンプレートのavsファイルをエンコードしたいmpgファイルと同じ数だけ用意して名前をmpgファイルと同じにしてやればいいだけ。
そして、それは先程のdgindex.batで実施済みというわけです。
GetScriptName関数はオリジナルから若干、手を加えてあります。
というのも、円記号で区切り位置を見つける時に、ファイル名に日本語が含まれていると、円記号(0x5C)問題で変な位置でファイル名が区切られることがあるようなので(詳しくは調査していない)。
関数内部でavsファイルのパス(avs_path)を定義するという、あまりスマートではない対策なのだが、文字列処理は深く考えると泥沼なので、まあいいやと思っていたり。
ついでに拡張子も取っ払うようにしてあります。
最後はx264, neroAacEnc, mp4boxで処理する部分のbatファイル
enc.bat
@echo off set x264=E:\encode\x264.exe set neroAAC=E:\encode\neroAacEnc.exe set mp4box=E:\encode\MP4Box.exe set SOURCE_PATH=E:\tvdata\ :loop :: 入力がなければ:endにジャンプ。 :: 拡張子が".avs"または".AVS"以外のファイルが入力されたら:errorにジャンプ。 if "%~1"=="" goto end if /i not "%~x1"==".avs" goto error @echo on set SOURCE_FILE="%~n1" "%x264%" --preset slower --crf 21 --psy-rd 0.4:0 --qpmin 0 --qpmax 69 --qpstep 12 --rc-lookahead 40 --partitions p8x8,b8x8,i8x8,i4x4 --scenecut 60 --min-keyint 1 --keyint 240 --me hex --subme 7 --ref 6 --threads 8 -o "%SOURCE_PATH%%~n1.264" "%~dpnx1" "%neroAAC%" -br 128000 -if "%SOURCE_PATH%%~n1.wav" -of "%SOURCE_PATH%%~n1.m4a" "%mp4box%" -add "%SOURCE_PATH%%~n1.264"#video "%SOURCE_PATH%%~n1.m4a" -fps 23.976023976 -out "%SOURCE_PATH%%~n1.mp4" @echo off goto shift :: エラーメッセージの表示 :error echo [入力ファイルエラー] %~nx1 echo avsファイルを指定して下さい... echo. :: パラメーターを1つシフトさせてから:loopへ戻る :shift shift goto loop :: 終了処理 :end echo Done... shutdown /s /t 1
dgindex.batで作成されたavsファイルをenc.batにドラッグ&ドロップすれば(複数可)、エンコードが開始されます。
処理の動き方はdgindex.batと同じことがすぐ分かると思います。
最後はシャットダウンするようになっています。したくない場合はshutdownコマンドの行を削除すればOK。
"shutdown /h"で休止状態に持っていくのもあり。
"tasklist"コマンドで他のアプリの稼動状態から終了処理を分岐させるのも手。
自動化は、導入は面倒くさいけど、導入してしまえば、やっぱりいろいろ捗ります。
もっと早くにやっとけば良かったと思っているところ。
※batファイルやavsファイル中のファイルパスは各自のPC環境にあわせて変更してください
※コード表示にコードをハイライトする「Code Prettify」ウィジェットを利用させてもらいました。avsスクリプトには対応してないので、色付けが少しおかしいですが、まあ気にせずに。
0 Comment:
Post a Comment