ビデオ キャプチャ形式を設定する方法
ビデオ キャプチャ デバイスでは、いくつかのキャプチャ形式がサポートされている場合があります。 通常、形式は圧縮の種類、色空間 (YUV または RGB)、フレーム サイズ、またはフレーム レートによって異なります。
サポートされている形式の一覧は、 プレゼンテーション記述子に含まれています。 詳細については、「 プレゼンテーション記述子」を参照してください。
サポートされている形式を列挙するには:
- キャプチャ デバイスのメディア ソースを作成します。 「ビデオ キャプチャ デバイスの列挙」を参照してください。
- メディア ソースで IMFMediaSource::CreatePresentationDescriptor を呼び出して、プレゼンテーション記述子を取得します。
- IMFPresentationDescriptor::GetStreamDescriptorByIndex を呼び出して、ビデオ ストリームのストリーム記述子を取得します。
- ストリーム記述子 で IMFStreamDescriptor::GetMediaTypeHandler を呼び出します。
- IMFMediaTypeHandler::GetMediaTypeCount を呼び出して、サポートされている形式の数を取得します。
- ループで、 IMFMediaTypeHandler::GetMediaTypeByIndex を呼び出して、各形式を取得します。 形式は メディアの種類で表されます。 詳細については、「 ビデオ メディアの種類」を参照してください。
次の例では、デバイスのキャプチャ形式を列挙します。
HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
IMFPresentationDescriptor *pPD = NULL;
IMFStreamDescriptor *pSD = NULL;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pType = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
BOOL fSelected;
hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
DWORD cTypes = 0;
hr = pHandler->GetMediaTypeCount(&cTypes);
if (FAILED(hr))
{
goto done;
}
for (DWORD i = 0; i < cTypes; i++)
{
hr = pHandler->GetMediaTypeByIndex(i, &pType);
if (FAILED(hr))
{
goto done;
}
LogMediaType(pType);
OutputDebugString(L"\n");
SafeRelease(&pType);
}
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
この例で使用する関数は LogMediaType
、「 メディアの種類のデバッグ コード」のトピックに記載されています。
キャプチャ形式を設定するには:
- 前の例に示すように、 IMFMediaTypeHandler インターフェイスへのポインターを取得します。
- IMFMediaTypeHandler::GetMediaTypeByIndex を呼び出して、index で指定された目的の形式を取得します。
- IMFMediaTypeHandler::SetCurrentMediaType を呼び出して、形式を設定します。
キャプチャ形式を設定しない場合、デバイスでは既定の形式が使用されます。
次の例では、キャプチャ形式を設定します。
HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
IMFPresentationDescriptor *pPD = NULL;
IMFStreamDescriptor *pSD = NULL;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pType = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
BOOL fSelected;
hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->SetCurrentMediaType(pType);
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
形式が返される順序は、デバイスによって異なります。 通常、圧縮の種類または色空間によって最初にグループ化されます。次に、最小のフレーム サイズから各グループ内の最大フレーム サイズまで。
フレーム レートは、他のフォーマット属性とは若干異なる方法で処理されます。 詳細については、「 ビデオ キャプチャ フレーム レートを設定する方法」を参照してください。
Note
一部のデバイスでは、形式の一覧に、各形式の重複するエントリが含まれます。 たとえば、デバイスが 15 個の個別のキャプチャ形式をサポートしている場合、リストには 30 個のエントリが含まれます。 各ペア内で、メディアの種類の 1 つに FORMAT_VideoInfo と等しい属性MF_MT_AM_FORMAT_TYPE、もう 1 つのメディアの 種類 MF_MT_AM_FORMAT_TYPE FORMAT_VideoInfo2と等しくなります。 (これら 2 つの値は、ヘッダー ファイル uuids.h で定義されています)。2 番目の型には、追加の色情報 (拡張色情報) が含まれている場合や、インターレース (MF_MT_INTERLACE_MODE) に別の値が表示される場合もあります。 これらの重複する型は、古い DirectShow アプリケーションをサポートするために存在します。 Media Foundation アプリケーションでは、重複する FORMAT_VideoInfo2 の種類が一覧表示されるたびに 、FORMAT_VideoInfo の種類を無視する必要があります。
関連トピック