0

これが実際のメイン コードです。プレビューは問題なく動作します。

int main()
{
   HRESULT hr = CoInitialize(NULL);

   ICaptureGraphBuilder2   *pBuild;
   IGraphBuilder           *pGraph;
   IMoniker                *pMoniker;
   IMediaControl           *pControl;
   IMediaEvent             *pEvent;

   InitCaptureGraphBuilder(&pGraph, &pBuild);

   hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
   hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

   IBaseFilter    *pCap;   // Video capture filter
   IEnumMoniker   *pEnum;

   hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
   DisplayDeviceInformation(pEnum, &pMoniker);
   hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);

   if (SUCCEEDED(hr))
   {
      hr = pGraph->AddFilter(pCap, L"Capture Filter");
   }

   hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
   hr = pControl->Run();

   _getch();

   pControl->Release();
   pCap->Release();
   pGraph->Release();
   pBuild->Release();
   CoUninitialize();

   return 0;
}

これで、記録には次のコードが必要であることがわかりました。

IBaseFilter *pMux;

hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, L"D:\\test.avi", &pMux, NULL);
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, NULL, pMux);

これをプレビュー コードに置き換えると、実際には AVI ファイル (非常に大きなファイル) が作成されますが、空で、ビデオはありません。つまり、次のものを置き換えています。

hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);

コード、上記のもの。

私が間違っていること、またはより良いこと、私が見逃していることは何ですか?

4

1 に答える 1

1

RenderStream通常は使いやすさのために、ドキュメント化された公開 API を介して他の呼び出しを内部的に埋め込む高レベルのメソッドです。シンプルに見えますが、何かがうまくいかず、期待どおりに動作しない場合のトラブルシューティングはそれほど簡単ではありません。コードだけを視覚的に検査することはさらに困難です。また、ソリューションに近づくために自分でできることがあるため、最も効率的ではありません。それは次のとおりです。

その後の手順は、次の 2 つのいずれかに沿っています。

  1. 実際に動作するサンプル コードを自分のものと比較して違いを調べ、問題の原因を突き止めます。

  2. 結果のフィルタ グラフ トポロジを検査して、グラフをROTに配置し、 GraphEditまたは同様のツールを使用してチェックして、トポロジが期待どおりであることを確認します。

HRESULTまた、すでに行っているように見えるコードを確認する必要もあります。

于 2013-06-10T14:19:56.273 に答える