Saturday, July 30, 2016

Windows10 MP4 M2TS 動画サムネイルが表示されない

いつからかExplorerでMP4とM2TSのサムネイル(縮小表示)がされなくなっていることに気が付きました。
初歩的な対応方法はネットに色々ありますが、うちのPCは特殊なカスタマイズがされているので、いずれでも対応はできませんでした。
サムネイルとは、エクスプローラのメニューで表示→中/大/特大アイコンにすると、アプリのアイコンの代わりに表示される動画ファイル内の静止画のことです。
スマートフォンで撮影した動画形式はMP4、デジカメはM2TSですが、いずれもサムネイルが表示されません。
これらのファイルの動画圧縮はH.264/MPEG-4AVCという規格で、Windows7以降はOSが標準で対応しています。ところが、Microsoftの動画を展開するプログラム(デコーダという)は低速で重いので、1080pの動画などは結構なスペックのPCでもコマ落ちしたりします。
そこでffdshowというフリーの高速デコーダを使っているのですが、そのためにはMicrosoftの標準デコーダに邪魔されないように細工をする必要があります。この辺りのカスタマイズはかなり複雑なので、ネットでも情報は少ないです。
Windowsが動画を再生する時は、動画の種類を解析して対応するデコーダに渡すのですが、その過程はDirectShowというフレームワークで処理されます。
まず動画ファイルが読み込まれると、DirectShowはスプリッタと呼ばれるプログラムで動画の構造を解析し、映像データ、音声データ、字幕データなどに分解します。そして対応する各デコーダにデータを渡します。
この時、映像データに対応するデコーダが複数種類あると、Windowsはメリット値と呼ばれる優先順位を参照し、最も優先度の高いコーデックにデータを渡すのです。
WindowsXPの頃は、このメリット値を変更することでデコーダを指定できたのですが、Windows7以降はメリット値を変更しても、Microsoftのデコーダにデータを渡してしまうように仕様が変更になりました。この仕様を外部から変更することはできないので、Windows7以降では、Microsoftのビデオデコーダ自体を無効化する方法が考案されました。といっても方法は単純で、デコーダファイルの名前を変えてやるだけです(削除でもいいですが必要になった時に困るので)。

デコーダは以下のフォルダに格納されています。

c:\windows\system32\msmpeg2vdec.dll

64bit版のWindowsでは、32ビット用のファイルが以下にもあります。

c:\windows\syswow64\msmpeg2vdec.dll

ファイル名を変えるとWindowsは諦めて、メリット値で最優先のデコーダにデータを渡すようになります。ちなみにこれを簡単にやってくれるFilterTweakerというツールがあります。
というわけで前置きが長くなりましたが、Windows10のMP4とM2TSのサムネイルの作成は、このmsmpeg2vdec.dllが行っているらしく、うちのPCのようにファイル名を変えてしまっているとサムネイル作成に失敗してしまうようです。Windows8ではffdshowのデコーダでもサムネイルは表示されていたように思うので、Windows10から仕様が変わったのかもしれません。

ということで、c:\windows\system32\msmpeg2vdec.dllを元に戻したらサムネイルが表示されるようになりました。

うちでは昔から高速な動画再生ソフトを使っているのですが、このソフトは32bit版なのでffdshowも32bit版を使用しています。Windows64bit版のサムネイル作成は、64bit版のc:\windows\system32の方のmsmpeg2vdec.dllを使うようなので、こちらだけ元に戻しておくことで対策完了としました。
それにしても64bit版がsystem32フォルダで、32bit版がsyswow64フォルダにあるのは、互換性確保の為とはいえ気持ち悪い仕様です。