Introduction
備忘録。
仕事で MediaCaptureWPF という OSS を使っていたのだが、特定のマシンで E_NOINTERFACE (0x80004002) がスローされることに気づいた。
この OSS は、
CameraPreview allows previewing the camera video stream of the WinRT MediaCapture API in Desktop WPF apps.
とあるように、WPF 上で WinRT MediaCapture API を活用してのカメラストリームをプレビューする機能を提供している。
OpenCVSharp でも使えば実現はできるが、MediaCaptureWPF が優れているのは、Media Foundation による GPU アクセラレーションを活用し、C++ から直接 Image にレンダリングできるため高速な点にある。
OpenCVSharp の場合は Mat
を取得し、Image に変換などの手間が必要になる。
と、良い点しかないように思えるが…動かない時がある。
それが E_NOINTERFACE (0x80004002) のスロー。
How to resolve?
この問題は Issue として上がってはいるが未解決である。
- System.Runtime.InteropServices.COMException #10
- COMException (E_NOINTERFACE) raised inside CapturePreviewNative when run inside Parallels Desktop #11
#11 では詳細な情報が提供されており、自分の遭遇した事象と同一。
1 | CComPtr<IMFDXGIBuffer> bufferDxgi; |
の最後の行で例外がスローされる。
結論は、 GPU デバイスが適切にインストールされていないことに問題がある。
下記は GPU デバイスのインストール状態 (有効/無効) における、MeidaCaptureWPF のサンプルプログラムのデバッグの違いを示している。
GPU なし
Intel UHD Graphics のみ有効
Nvidia GPU のみ有効
根本的にこの問題を解決するには、GPU が使えないときは CPU バッファを使うようにする他ない。
それができなければ、iGPU (Integrated Graphics Processing Unit) のドライバをインストールするのが一番手っ取り早い。