Festlegen der Videoaufnahme-Bildfrequenz

Ein Videoaufnahmegerät unterstützt möglicherweise eine Reihe von Bildfrequenzen. Wenn diese Informationen verfügbar sind, werden die minimalen und maximalen Bildraten als Medientypattribute gespeichert:

attribute Beschreibung
MF _ MT _ FRAME _ RATE _ RANGE _ MAX Maximale Bildfrequenz.
MF _ MT _ FRAME _ RATE _ RANGE _ MIN Minimale Bildfrequenz.

Der Bereich kann je nach Erfassungsformat variieren. Bei größeren Rahmengrößen kann beispielsweise die maximale Bildfrequenz reduziert werden.

So legen Sie die Bildfrequenz fest:

  1. Erstellen Sie die Medienquelle für das Erfassungsgerät. Weitere Informationen finden Sie unter Enumerating Video Capture Devices (Aufzählen von Videoaufnahmegeräten).
  2. Rufen Sie ÜBER DIE MEDIENQUELLE::CreatePresentationDescriptor für die Medienquelle auf, um den Präsentationsdeskriptor abzurufen.
  3. Rufen Sie DIE DATEI PRESENTPresentationDescriptor::GetStreamDescriptorByIndex auf, um den Streamdeskriptor für den Videostream abzurufen.
  4. Rufen Sie IM STREAM-Deskriptor DIESSTREAMDESCRIPTOR::GetMediaTypeHandler auf.
  5. Aufzählen der Aufzeichnungsformate, wie unter Festlegen des Videoaufnahmeformatsbeschrieben.
  6. Wählen Sie das gewünschte Ausgabeformat aus der Liste aus.
  7. Fragen Sie den Medientyp nach den Attributen MF MT FRAME RATE RANGE _ _ _ _ _ MAX und MF MT FRAME RATE RANGE _ _ _ _ _ MIN ab. Diese Werte geben den Bereich der unterstützten Frameraten an. Das Gerät unterstützt möglicherweise andere Bildfrequenzen innerhalb dieses Bereichs.
  8. Legen Sie das MF _ MT _ FRAME-Attribut für den Medientyp fest, um die gewünschte Bildfrequenz anzugeben.
  9. Rufen Sie ÜBERMEDIATypeHandler::SetCurrentMediaType den geänderten Medientyp auf.

Im folgenden Beispiel wird die Bildfrequenz auf die maximale Bildfrequenz festgelegt, die das Gerät unterstützt:

HRESULT SetMaxFrameRate(IMFMediaSource *pSource, DWORD dwTypeIndex)
{
    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(dwTypeIndex, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->GetCurrentMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get the maximum frame rate for the selected capture format.

    // Note: To get the minimum frame rate, use the 
    // MF_MT_FRAME_RATE_RANGE_MIN attribute instead.

    PROPVARIANT var;
    if (SUCCEEDED(pType->GetItem(MF_MT_FRAME_RATE_RANGE_MAX, &var)))
    {
        hr = pType->SetItem(MF_MT_FRAME_RATE, var);

        PropVariantClear(&var);

        if (FAILED(hr))
        {
            goto done;
        }

        hr = pHandler->SetCurrentMediaType(pType);
    }

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

Videoaufnahme