Festlegen des Videoaufnahmeformats

Ein Videoaufnahmegerät unterstützt möglicherweise mehrere Aufnahmeformate. Formate unterscheiden sich in der Regel nach Komprimierungstyp, Farbraum (YUV oder RGB), Framegröße oder Bildrate.

Die Liste der unterstützten Formate ist im Präsentationsdeskriptor enthalten. Weitere Informationen finden Sie unter Präsentationsdeskriptoren.

So listeen Sie die unterstützten Formate auf:

  1. Erstellen Sie die Medienquelle für das Erfassungsgerät. Weitere Informationen finden Sie unter Aufzählen von Videoaufnahmegeräten.
  2. Rufen Sie IMFMediaSource::CreatePresentationDescriptor für die Medienquelle auf, um den Präsentationsdeskriptor abzurufen.
  3. Rufen Sie IMFPresentationDescriptor::GetStreamDescriptorByIndex auf, um den Streamdeskriptor für den Videostream abzurufen.
  4. Rufen Sie IMFStreamDescriptor::GetMediaTypeHandler für den Streamdeskriptor auf.
  5. Rufen Sie IMFMediaTypeHandler::GetMediaTypeCount auf, um die Anzahl der unterstützten Formate abzurufen.
  6. Rufen Sie in einer Schleife IMFMediaTypeHandler::GetMediaTypeByIndex auf, um die einzelnen Formate abzurufen. Das Format wird durch einen Medientyp dargestellt. Weitere Informationen finden Sie unter Videomedientypen.

Im folgenden Beispiel werden die Erfassungsformate für ein Gerät aufgelistet:

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;
}

Die LogMediaType in diesem Beispiel verwendete Funktion wird im Thema Medientypdebugcode aufgeführt.

So legen Sie das Erfassungsformat fest:

  1. Rufen Sie einen Zeiger auf die IMFMediaTypeHandler-Schnittstelle ab, wie im vorherigen Beispiel gezeigt.
  2. Rufen Sie IMFMediaTypeHandler::GetMediaTypeByIndex auf, um das gewünschte Format abzurufen, das durch index angegeben wird.
  3. Rufen Sie IMFMediaTypeHandler::SetCurrentMediaType auf, um das Format festzulegen.

Wenn Sie das Aufzeichnungsformat nicht festlegen, verwendet das Gerät das Standardformat.

Im folgenden Beispiel wird das Erfassungsformat festgelegt:

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;
}

Die Reihenfolge, in der Formate zurückgegeben werden, hängt vom Gerät ab. In der Regel werden sie zuerst nach Komprimierungstyp oder Farbraum gruppiert. und dann von der kleinsten Framegröße bis zur größten Framegröße innerhalb jeder Gruppe.

Die Bildfrequenz wird etwas anders behandelt als die anderen Formatattribute. Weitere Informationen finden Sie unter Festlegen der Videoaufnahme-Bildrate.

Hinweis

Auf einigen Geräten enthält die Formatliste einen doppelten Eintrag für jedes Format. Wenn das Gerät beispielsweise 15 verschiedene Erfassungsformate unterstützt, enthält die Liste 30 Einträge. Innerhalb jedes Paares verfügt einer der Medientypen über das Attribut MF_MT_AM_FORMAT_TYPE gleich FORMAT_VideoInfo, während der andere MF_MT_AM_FORMAT_TYPE gleich FORMAT_VideoInfo2 hat. (Diese beiden Werte sind in der Headerdatei uuids.h definiert.) Der zweite Typ kann auch zusätzliche Farbinformationen (erweiterte Farbinformationen) enthalten oder einen anderen Wert für interlacing (MF_MT_INTERLACE_MODE) anzeigen. Diese doppelten Typen sind vorhanden, um ältere DirectShow-Anwendungen zu unterstützen. In einer Media Foundation-Anwendung sollten Sie den FORMAT_VideoInfo-Typ ignorieren, wenn ein duplizierter FORMAT_VideoInfo2-Typ aufgeführt wird.

 

Videoaufnahme