IntelグラフィックハードウェアH264 MFT ProcessInput呼び出しは、いくつかの入力サンプルを供給した後に失敗します。NvidiaハードウェアMFTでも同じように機能します。
DesktopDuplication APIを使用してデスクトップをキャプチャし、サンプルをGPUでRGBAからNV12に変換して、MediaFoundationハードウェアH264 MFTにフィードしています。これは、Nvidiaグラフィックスとソフトウェアエンコーダーで正常に動作しますが、インテルグラフィックスハードウェアMFTのみが使用可能な場合は失敗します。ソフトウェアMFTにフォールバックすると、同じIntelグラフィックマシンでコードが正常に機能します。また、Nvidiaグラフィックスマシンのハードウェアでエンコードが実際に行われるようにしました。 Intelグラフィックスでは、MFTはMEError("Unspecified error")を返します。これは最初のサンプルが供給された直後にのみ発生し、後続のProcessInputの呼び出し(イベントジェネレーターがMETransformNeedInputをトリガーしたとき)は"呼び出し先は現在それ以上の入力を受け付けていません"を返します。MFTがこれらのエラーを返す前に、さらにいくつかのサンプルを消費することはまれです。この動作は混乱を招くので、イベントジェネレーターがIMFAsyncCallbackを介してMETransformNeedInputを非同期でトリガーする場合にのみサンプルをフィードし、サンプルがフィードされるとすぐにMETransformHaveOutputがトリガーされるかどうかを適切にチェックします。同じ非同期ロジックがNvidiaハードウェアMFTとMicrosoftソフトウェアエンコーダーで正常に動作するとき、これは本当に困惑します。 インテルフォーラム自体にも同様の未解決の質問があります。私のコードは、以下のようにエンコーダーにd3dデバイスマネージャーも設定しているという事実を除いて、インテルスレッドで言及されているものに似ています。 また、他に3つのスタックオーバーフロースレッドがあり、ソリューションが提供されていない同様の問題を報告しています(MFTransformエンコーダー-> ProcessInputがE_FAILを返します& Intel MFTエンコーダーのD11テクスチャからIMFSampleを作成する方法&非同期MFTがMFTransformHaveOutputイベントを送信していません(インテルハードウェアMJPEGデコーダーMFT))。私はこれを改善することなく、可能なすべてのオプションを試しました。 色変換コードは、インテルメディアSDKサンプルから取得されます。ここに私の完全なコードもアップロードしました。 d3dマネージャーを設定する方法: void SetD3dManager() { HRESULT hr = S_OK; if (!deviceManager) { // Create device manager hr = MFCreateDXGIDeviceManager(&resetToken, &deviceManager); } if (SUCCEEDED(hr)) { if (!pD3dDevice) { pD3dDevice = GetDeviceDirect3D(0); } } if (pD3dDevice) { // NOTE: Getting ready for …