動画エンコードちょっと自動化



0 Comment
久しぶりに動画エンコードに関するエントリ
エンコードに関する設定ではなく、エンコードをより効率的にしようというもの。
参考にしたのは以下のサイトです。
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スクリプトには対応してないので、色付けが少しおかしいですが、まあ気にせずに。

コミティア99 & X III



0 Comment


コミティア99 & コミティアX III に参加してきました。
参加した皆さん、お疲れ様でした。

お座敷&展示中心イベントであるコミティアXは10年振りということで、体験するのは初めて。
オタク向けのフリーマーケットといった雰囲気で、なかなか楽しい空間でしたよ。
ギター片手に歌っている人がいれば、
手品の実演をしている人も、
ビーカーやフラスコに薬品入れて化学の実験講演している所があったり、
日本酒をおいしく飲むための講習会やってたり、
触ると危険!高圧空中放電スピーカーなるものを展示していたり(本当に空中放電してたw)、
最近流行の自転車系同人誌の関係でロードバイクがズラーッと展示してあったり、
プラレールのジオラマ展示あったりと、
もうやりたい放題って感じでしたね。

ちなみに会場内で一番長い列ができていたのは富士宮やきそばの屋台だったりw
というのも、ソースのおいしそうな香りが、屋台から会場内に撒き散らされてまして、香りだけですごい腹減らされた。
もう、あの香りは凶悪でしたよ。
自分も買おうかなと思ったけど、いつまで経っても列が長いままなのであきらめました・・・

次回の5月のコミティアはいよいよ100回目ということでかなり盛り上がるみたいで楽しみ。


同日、東京ビッグサイトでは、AKB48握手会やら女性向け同人誌合同イベントやら就活イベントがやっていまして、かなりの人出。
特にAKB48握手会はすごかったですね。
東1,2,3ホールを使っていたのですが、入り口から見た内部の様子は、コミケに匹敵する人の多さでしたよ。
AKB48の人気の高さを改めて感じた次第。