2012/03/18

MPEG2形式の動画をAvisynthから読み込む方法4種

AvisynthからMPEG2形式の動画を読み込む方法を、logoGuilloでサポートしているプラグインを中心に載せています。m2v.vfpとDGIndexの2種類がメジャーな方法だと思います。

Avisynthは出来る事が多いソフトウェアですが、動画を読み込むだけならAvisynthのpluginフォルダに使用したいプラグインを入れ、AVS上で記述して呼び出すだけで利用できます。但し、Avisynthのプラグインのオートローディングが動作しない一部の環境ではpluginsフォルダに入れたプラグインが自動的に読み込まれないので、LoadPlugin()を使用して明示的に読み込むプラグインを指定する必要があります。

検証環境:
・Avisynth 2.58 x86
・Windows 7 x64


MPEG-2 VIDEO VFAPI Plug-In(m2v.vfp)を使用する場合

私は特に理由がない場合はこの方法でMPEG2動画を読み込んでいます。warpsharpパッケージに同梱されているwarpsharp.dllを使用してm2v.vfpをAvisynthから利用します。速度はそれほど速くはありませんが、動作に関しては信用できます。

用意するもの:
・warpsharpパッケージ
・MPEG-2 VIDEO VFAPI Plug-In

MPEG-2 VIDEO VFAPI Plug-Inの設定(別記事)

サンプルコード:

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\warpsharp.dll")
LoadAviUtlInputPlugin("C:\Program Files\AviSynth 2.5\plugins\m2v.vfp", "MPEG2VIDEO")
MPEG2VIDEO("C:\test\test.m2v")

2行目でm2v.vfp(AviUtlの入力プラグインとしても使用できます)をAvisynthから呼び出す為に名前(MPEG2VIDEO)を付けています。


FFmpegSource ver.2 (ffms2.dll)を使用する場合

読み込みが速い上に、MPEG2以外にもFFmpegで読み込み可能な各種形式の動画を扱う事が出来ます。
但し、MPEG2等の一部の形式の動画を読み込んだ場合にはフレームアキュレートではありません。その為フレーム番号が±2フレーム程度ずれてしまう事があります。適当に自動でエンコードしておく用途等、少しでも速度を稼ぎたい場合に適しています。

用意するもの:
・FFmpegSource(ver.2)

サンプルコード:

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\ffms2.dll")
FFVideoSource("C:\test\test.m2v")


DGIndex(DGDecode.dll)を使用する場合

DGIndexのプロジェクトファイル(*.d2v)を読み込みます。一度DGIndexで読み込みたいMPEG2ファイルを開いてd2v形式で保存する必要があります。*.d2vのAvisynthからの読み込みにはDGIndexに同梱されているDGDecode.dllを使用します。

用意するもの:
・DGIndex

サンプルコード:

LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\DGDecode.dll")
DGDecode_MPEG2Source("C:\test\test.d2v")


DirectShow経由で読み込む場合

DirectShow経由で動画を読み込みます。理論上はWMPで開ける形式なら何でも読み込む事ができますが、挙動が使用するデコーダーによって全く異なるので、基本的に使用するべきではありません。
私の環境(Microsoft DTV-DVD Video Decoder)では総フレーム数が実際よりも少なく報告される為、正常に動作しませんでした。また、デコーダーによってfps、アスペクト、インタレース、YC伸張/色空間等がどう処理されるか、正しい値が返ってくるかどうかも分かりません。

サンプルコード:

DirectShowSource("C:\test\test.m2v")


関連記事
Avisynthビデオ入力プラグインベンチ結果(MPEG2)

エンコード関連記事一覧