https://naba-san.hatenablog.com/


マルチコア環境の動画再生でCPU使用率が50% (25%) で頭打ちになり、映像がコマ落ち(遅延)する件

Media Player Classic Home Cinema (MPC-HC) で H.264/AVC (1920x1080) の動画を再生する際、CPU使用率が50%前後を推移し、映像が遅延する問題に遭遇しました。

とても単純なお話で、MPC-HC の H.264 内蔵フィルタ(ビデオデコーダ)として組み込まれている ffmpeg のバージョンが古いらしく、マルチスレッド化されていない事が原因でした。ffmpeg がマルチスレッドに対応したのは最近のお話らしいので、ffmpeg デコーダを搭載しているものであれば、他のプレーヤでも同様の問題が生じる可能性があります。

現在では MPC-HC のバージョンも上がって問題は解消していますが、古い MPC-HC を利用されたい方の為に、または他のプレーヤーで同種の問題に遭遇された方の為に、幾つか解決策を書いておきます。

DXVAで再生する (ハードウェア再生支援)
要するにGPUに再生を丸投げするアレの事です。

DXVAでの再生支援は、OS(DirectX)、コーデックや解像度のサポート状況がGPUにより異なりますので、DXVAに対応しているからと言って問答無用で切り替えてしまうと、新たな問題を引き起こす可能性があります。

特に、昨今のAV事情において、シングルスレッドで高解像度の動画を再生できないような微妙な環境ですと、GPUにDXVAで再生を丸投げしようにも能力的に不足が生じる可能性があります。うちの環境でも、同じファイルをDXVAに丸投げすると、ブロックが乗り映像が乱れる現象が発生しました。(処理落ち?)

このような環境では、DXVAに頼らずにCPUパワーで頑張ってソフトウェアデコードさせた方が幸せになれるでしょう。また、マルチディスプレイ環境でDXVAを利用すると、GPUを跨いでのディスプレイ切替の際にレンダリングで不具合が生じる事もあります(当方環境の場合、Windows Media Playerではアプリケーションごと強制終了します)。GPUを利用した再生支援なので当然と言えば当然なのですが、そういった環境でも DXVA は切っておいた方が無難です。

マルチスレッドの対応フィルタを準備する

ffdshow-tryoutsは比較的新しいlibav(ffmpegの派生プロジェクト)を搭載しており、マルチスレッドに対応しているようです。
ev3713_20110102_clsid できちんとCPUを2コア使用してデコードしてくれる事を確認していますので、必要に応じて MPC-HC の外部フィルタに登録してやると良いでしょう。
なお、ffdshow-tryouts にもDXVAによる支援デコーダが搭載されていますが、MPC-HC 同様にGPUが対応しない解像度の再生には使用しない方が良いです。MPC-HC 内蔵フィルタの DXVA デコーダ同様、映像にブロックノイズが乗ることを確認しています。

新しいバージョンの MPC-HC を使用する
一番無難な方法です。新しいバージョン(Ver 1.6.0.4014以降) の MPC-HC ではデコーダのマルチスレッドへの対応を謳っており*1、バージョン 1.6.4.6052 でCPUをきちんと使い切ることを確認しています。(最近の ffmpeg は libav 同様に ffmpeg-mt のマージを済ませているそうなので、対応バージョンに切り替えたんでしょうかね。)

MPC-HC 以外のプレーヤでも、新バージョンに切り替えて問題が解消しないか確認してみると良いと思います。