ビデオ キャプチャ形式を設定する方法

ビデオ キャプチャ デバイスでは、いくつかのキャプチャ形式がサポートされている場合があります。 通常、形式は圧縮の種類、色空間 (YUV または RGB)、フレーム サイズ、またはフレーム レートによって異なります。

サポートされている形式の一覧は、 プレゼンテーション記述子に含まれています。 詳細については、「 プレゼンテーション記述子」を参照してください。

サポートされている形式を列挙するには:

  1. キャプチャ デバイスのメディア ソースを作成します。 「ビデオ キャプチャ デバイスの列挙」を参照してください。
  2. メディア ソースで IMFMediaSource::CreatePresentationDescriptor を呼び出して、プレゼンテーション記述子を取得します。
  3. IMFPresentationDescriptor::GetStreamDescriptorByIndex を呼び出して、ビデオ ストリームのストリーム記述子を取得します。
  4. ストリーム記述子 で IMFStreamDescriptor::GetMediaTypeHandler を呼び出します。
  5. IMFMediaTypeHandler::GetMediaTypeCount を呼び出して、サポートされている形式の数を取得します。
  6. ループで、 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 、「 メディアの種類のデバッグ コード」のトピックに記載されています。

キャプチャ形式を設定するには:

  1. 前の例に示すように、 IMFMediaTypeHandler インターフェイスへのポインターを取得します。
  2. IMFMediaTypeHandler::GetMediaTypeByIndex を呼び出して、index で指定された目的の形式を取得します。
  3. 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 の種類を無視する必要があります。

 

ビデオ キャプチャ