2012/01/29

現在運用中のAvisynth Scriptのマスタ

現在運用中のAVSファイルのマスタに関しての記事です。AVSファイルだけ出しても分かりにくいので、先ずはエンコードの基本的なフローからご覧下さい。

エンコードの基本フロー
  1. (*.m2v + *.aac)を用意する
  2. (*.m2v + *.aac)に対するCMカット用のTrimコマンドを生成しておく
  3. 音声(*.aac)をFakeAacWavで疑似wavファイル化(*.wav)
  4. AVSに動画(*.m2v)と音声(*.wav)を読み込み、x264で動画をエンコード(*.mp4)
  5. AVSファイル内でCMカットした音声(*.wav)を出力
  6. CMカットした疑似wavファイル(*.wav)をFakeAacWavでaacに戻す
  7. x264でエンコードした動画(*.mp4)にMP4BoxでCMカット済aacをMUX
*FakeAacWavで疑似wavファイルを生成する段階で、ファイル名に記述されている音声と動画の時間差("* DELAY -*ms.aac")が処理されるので音ズレが発生しません。

コンセプト等
  • 実写ソースは重たい上に縮まないので滅多にエンコードしません。その為、対象は24fpsソースのみです。
  • インターレース解除の誤判定を防ぐ為、縞判定せず一律で処理します。
  • 30/24混合や60iテロップ等の処理が面倒なので逆テレシネ処理で全て24fps化します。
  • x264側でcrfを下げるより軽くノイズリダクションを掛けた方がサイズ対画質で良い結果が得られたので、輝度だけFFT系3DNRを加えます。
  • シャープフィルタはNR処理による解像感低下の埋め合わせ程度に軽くかけます。
  • 見栄えさせる為の色調補正やシャープフィルタの類は再生時に行うべきだと考えています。YC伸張はしません。

運用環境
  • Windows 7 x64 SP1
  • Avisynth 2.58 x86
  • Intel Core i7-860(定格)
  • DDR3-1333 12GB
  • AMD Radeon HD5850

使用するプラグイン

m2v.vfp + warpsharp.dll
MPEG2の読み込みに使用します。MPEG2のデコーダーは多種ありますが、MPEG-2 VIDEO VFAPI Plug-Inの動作は特に信用できます。

TIVTC.dll + TDeint.dll
インターレースの解除と24fps化(逆テレシネ)に使用します。

FFT3dGPU.dll
ノイズリダクション処理に使用します。

AVSファイルのサンプル(1440x1080、24fps、16:9用)

SetMemoryMax(1024)

###config
VideoSource = "#M2V_IN#"
AudioSource = "#WAV_IN#"
AudioOut = "#WAV_OUT#"
PPath = "#PPath#\"
M2VVFPPath = "#M2VVFPPath#"

LoadPlugin(PPath + "FFT3dGPU.dll")
LoadPlugin(PPath + "TIVTC.dll")
LoadPlugin(PPath + "TDeint.dll")

###inputVideo
LoadAviUtlInputPlugin(M2VVFPPath, "MPEG2VIDEO")
clip=MPEG2VIDEO(VideoSource)
clip=KillAudio (clip)

###inputAudio
aclip=WavSource(AudioSource)
aclip=KillVideo (aclip)

###AV_Dub
AudioDubEx (clip, aclip)

###CMcut
#TRIM#

###AudioOut&DelAudio
SoundOut(output = "WAV", filename=AudioOut, autoclose = true, showprogress=true)
KillAudio ()

###Deinterlace,30 -> 24
TDeint(mode=0,order=1,type=2,tryweave=true,mtnmode=3)
tdecimate(mode=1)

#GPU Luma NR
FFT3DGPU(sigma=1.7,beta=1 ,plane=0 ,bw=32 ,bh=32 ,ow=16 ,oh=16,bt=4 ,mode=1 ,degrid=1,

interlaced=false ,wintype=2 ,precision=0,sharpen=0.125,svr=0.8,smin=6,smax=13)

###output
ConvertToYV12()
return last

AVSファイルのサンプル(1920x1080、24fps、16:9用)

SetMemoryMax(1024)

###config
VideoSource = "#M2V_IN#"
AudioSource = "#WAV_IN#"
AudioOut = "#WAV_OUT#"
PPath = "#PPath#\"
M2VVFPPath = "#M2VVFPPath#"

LoadPlugin(PPath + "FFT3dGPU.dll")
LoadPlugin(PPath + "TIVTC.dll")
LoadPlugin(PPath + "TDeint.dll")

###inputVideo
LoadAviUtlInputPlugin(M2VVFPPath, "MPEG2VIDEO")
clip=MPEG2VIDEO(VideoSource)
clip=KillAudio (clip)

###inputAudio
aclip=WavSource(AudioSource)
aclip=KillVideo (aclip)

##AV_Dub
AudioDubEx (clip, aclip)

###CMcut
#TRIM#

###AudioOut&DelAudio
SoundOut(output = "WAV", filename=AudioOut, autoclose = true, showprogress=true)
KillAudio ()

###Deinterlace,30 -> 24
TDeint(mode=0,order=1,type=2,tryweave=true,mtnmode=3)
tdecimate(mode=1)

#GPU Luma Filtering
FFT3DGPU(sigma=1.7,beta=1 ,plane=0 ,bw=32 ,bh=32 ,ow=16 ,oh=16,bt=4 ,mode=1 ,degrid=1,

interlaced=false ,wintype=2,precision=0,sharpen=0.125,svr=1.0,smin=6,smax=13)

###output
ConvertToYV12()
return last

AVSファイルの説明

1440x1080用と1920x1080用で異なる部分はFFT3DGPUのパラメータのみです。

別記事:地上波ソースをエンコードする際にFFT3DGPUでシャープフィルタを縦と横で異なる強度でかける理由

SetMemoryMax(1024)
Avisynthの使用するメモリを制限します。
avs2yuvやavs2pipemodが「動作を停止しました」等のメッセージで落ちる事があったので追加してあります。

別記事:Avisynthが偶に落ちる問題がSetMemoryMax()で解決した

###config
エンコードに必要なパス類の設定とプラグインの読み込みを行います。

###inputVideo
###inputAudio
###AV_Dub
映像と音声を別々に読み込んでMUXします。

###CMcut
Trimコマンドを使用してCMをカットします。

###AudioOut&DelAudio
CMカットした状態の音声を書き出します。

###Deinterlace,30 -> 24
インターレースを解除して逆テレシネ処理し、プログレッシブな24fpsにします。

#GPU Luma NR
FFT3DGPUを使用して輝度だけ軽くノイズリダクション処理をかけ、エンコード後のサイズを抑えます。
また、同時に内蔵のシャープフィルタをNR処理による解像感低下の埋め合わせ目的で軽くかけます。

GPU(DirectX 9)を使用して処理する為、CPUに対してGPUが貧弱な環境では数fpsしか出ない等、異常に遅くなる事がありました。

異常に遅かった環境
  • Core i7-860 (2.8GHz) + Radeon HD3850
  • Core 2 Duo E6850 (3.0GHz) + G33内蔵グラフィック
正常に動作した環境
  • Core 2 Duo E6420 (2.13GHz) + Radeon HD3850
  • Core i7-860 (2.8GHz) + Radeon HD5850
また、複数本同時にエンコードする場合はVRAMの使用率も確認した方が良いかもしれません。

###output
色空間をYV12にして出力します。
AviUtlでAVSを読み込ませたい場合はYUY2にします。

置き換えキーワードについて

エンコード用のBAT内でAVSファイルをマスタからコピーして、CLIのテキスト置き換えソフトでキーワードを置き換え処理する事でパラメータを代入しています。
文字列置き換えソフトは日本語に対応したCLIの物なら何でも良いのですが、私は文字列置換を使用しています。


chikan.exe "%TEMP_AVS%" #M2V_IN# "%INPUT_DIR%%INPUT_FILE%.m2v"

以下、置き換えキーワードの説明

#M2V_IN#
エンコードする動画(*.m2v)のフルパス。

#WAV_IN#
エンコードする音声(*.wav)のフルパス。

#WAV_OUT#
CMカットした音声(*.wav)の出力先のフルパス。

#PPath#
Avisynthのプラグインディレクトリのフルパス

#M2VVFPPath#
m2v.vfpのフルパス

#TRIM#
この箇所にCMカットをする為のTrimコマンドを入れます。
私はAviUtlで書き出したキーフレームリストからatf02で生成、又はlogoGuilloで直接出力しています。

マルチスレッド化による高速化

環境によってはTDeint、ConvertToYV12等にMT()を使用する事で高速化する場合があります。
しかし処理によっては画面分割による高速化が出来なかったり逆にボトルネックとなる場合もあるので、基本的にはメモリやHDD等のリソースが許す限り並列エンコードをした方が効率は良いです。
私は一部処理をMT化した上で2本同時にエンコードしています。

MT("ConvertToYV12()",threads=8)

最後に

用途や目的によって最適なAVSファイルの書き方は変わります。
また処理を自由に記述出来る点がAvisynthの良いところでもあるので、是非色々なフィルタや方法を試してみて下さい。

関連記事

エンコード関連記事一覧