次のコードを使用して、Web カメラからキャプチャし、同時にビデオをプレビューしようとしています ( pRendererはウィンドウ化された VMR9 フィルターを指し、 mPMuxはICaptureGraphBuilder2::SetOutputFileNameによって返されるマルチプレクサーを指します)。
hr = mPBuild->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
mPCapVideo,
NULL,
pRenderer);
hr = mPBuild->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
mPCapVideo,
NULL,
mPMux);
プレビューは問題ないように見えますが、キャプチャされたビデオは解像度が 352x288 しかなく、ひどく歪んでおり、その中に自分の顔の 2 つのインスタンスをまだ認識できますが、明るい緑色の領域があふれ、インターレース アーティファクトが表示されます。このビデオのレンダリングに失敗するのは Windows Media Player のみのようです。VLC と Quicktime は正しくレンダリングされた 352x288 ビデオを表示します。
デフォルトのレンダラーを使用する場合:
hr = mPBuild->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
mPCapVideo,
NULL,
NULL);
hr = mPBuild->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
mPCapVideo,
NULL,
mPMux);
キャプチャされた AVI のサイズは 640x480 で、Media Player を含むすべてのプレーヤーで適切に再生できます。
キャプチャされたファイルであっても、VMR9 がグラフ全体にビデオ サイズを課しているようです。この直感は、 IMediaControl::Runの呼び出しの直前に配置された次のコードによって確認されます。
IBasicVideo *pBasicVideo;
hr = mPGraph->QueryInterface(IID_PPV_ARGS(&pBasicVideo));
long w, h;
hr = pBasicVideo->GetVideoSize(&w, &h);
デフォルトのレンダラーではwとhは 640, 480 ですが、私の VMR9 インスタンスでは 352, 288 です。
** 編集 **
問題は、ある時点で、何らかの理由で、カメラの出力 PIN の形式が次の形式から切り替わることでした。
RGB24
352x288
に:
I420
352x288
そして、Media Player は AVI 内のそのようなフォーマットに問題があると思います。興味深いことに、Explorer のビデオのサムネイルは問題なく、最初のフレームを適切な色で見ることができました。