別のスレッドで実行される 2 つの DirectShow グラフを使用して、ストリーミング ビデオを表示し (別の VMR 9 を使用)、2 つの Web カメラからフレームをキャプチャします (Sample Grabber を使用)。1 つは内蔵 Web カメラ (HP TrueVision HD) で、もう 1 つは USB ポートに接続された Creative VF0520 です。他の USB ポートは使用されていません。
問題は、Creative カメラがオンになる (LED が点灯する) が、ストリームが流れないことです。内蔵 Web カメラを無効にしても問題は解決しません。ただし、Creative cam が接続されている唯一のカメラであるデスクトップで実行している場合、Creative cam は機能します。
このプログラムは、各カメラが 1 台しか接続されていない場合に機能します (Creative VF0520 は、デスクトップに接続された唯一のカメラである場合に機能します)。
この問題は、キャプチャ フィルターを使用したモニカー バインドから発生する可能性があると思われます。MSDNから変更されたコードを使用しています。これは、複数のカメラのキャプチャ フィルターにモニカーをバインドする正しい方法ですか?
ULONG VideoPlayer::GetMonikers(IEnumMoniker *pEnum, std::vector<IMoniker *> *pListMonikers)
{
ULONG numRetrieved = 0;
IMoniker* pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, &numRetrieved) == S_OK)
{
// Bind to vector
pListMonikers->push_back(pMoniker);
IPropertyBag *pPropBag;
HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
if (FAILED(hr))
{
(*ppMoniker)->Release();
continue;
}
// Get information to display
pPropBag->Release();
}
return numRetrieved;
}
次に、モニカーを含むベクターにアクセスして、キャプチャ フィルターにバインドします。
hr = listMonikers[CAMERA_ID]->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pCap);