タグにDirectShowをつけたのはわざとです。それは置いておいて。
CUDAのプログラム用にドライバを変更したことは書きましたが、その影響でハードウェアデコードを使ったときにFullHDでのH.264のデコードが間に合わなくなった、という現象が起きたことはすでに書きましたが・・・。
これはさすがに放置しておく訳にいかないので、どうにかしてハードウェアデコードを使わないようにしなければなりません。
WindowsMediaPlayer12ではデフォルトの状態では自動的にハードウェアデコードを使用するデコーダが使われてしまいます。(Microsoft DTV-DVD Video Decoderというフィルタ)
普通なら「CPUの負荷が下がる」「一定条件で画質が向上する」と言ったメリットの方が大きいのですが、今回の場合に限りそれが逆効果になってしまうというものです。
で、これをどうにかするためにいろいろと細工を行って解決する、という方法を考えました。
単純に考えれば次のいずれかを行えばどうにかなるはずです。
- システムに対してハードウェアデコードの使用を停止させる
- ハードウェアデコードを使用するフィルタを使用させない
が、これがかなり面倒なんですね・・・。その理由はつけたタグに連動しています。
ちなみに前者は調べた範囲では簡単な方法がなかったので行っていません。今回試した方法は後者です。
WMVだけなら簡単な設定でハードウェアデコードの使用を停止させることができるのですが・・・。
Windows7のWindowsMediaPlayer12は再生にDirectShowより優先してMediaFoundationを使用する
MediaFoundationは、WindowsVistaから導入されたDirectShowに替わる新しいメディアの処理用API群というわけです。自分も知らなかったのですが。
で、これのためにWindows7ではいくらDirectShowの設定を変更してもWindowsMediaPlayerではMediaFoundationで処理できるものはまずそちらで処理が行われるために設定が利かなかったわけです。
Windows7+WindowsMediaPlayer12では特殊な設定をしない限りffdshowといえどWindows7標準のデコードフィルタより優先して使用されることがない
これも面倒です。単純にffdshowを導入してH.264のデコードをさせようとしてもそれに割り込んで使用される訳なので。
システム標準のフィルタが優先して使用されるとかWindowsMediaPlayerはいろいろと難しい仕様だな~と思います。
というわけで、この問題を突破するために使った方法が以下の通りです。
- Win7CodecsをインストールしてffdshowおよびWindows7における特殊な設定を可能にする
- Win7DSFilterTweakerをダウンロードする
- Win7DSFilterTweakerでWindowsMediaPlayerにおいてMediaFoundationを使ったメディア再生を無効にする(無効にするとWindowsMediaPlayer12はDirectShow経由での再生を試みる)
- Win7Codecsの設定ツールを使ってH.264での優先フィルタをシステム標準フィルタからffdshowのフィルタに変更
この変更でやっとWindowsMediaPlayer12でのH.264のデコードがffdshow経由になる、という目的の結果を得ることができました。
だからなんなんだ?といわれたらそれまでな作業ですが・・・。
7/7 追記
ちなみに、この処理を行うとWindowsMediaPlayer12で音声ラインがマルチトラック時にトラックを選択できなくなります。(正しくはすべての音声ラインが同時に再生状態に陥ります)
マルチトラックのmp4を再生させるときに不利になりますのでその点は要注意、ということで・・・。