Festlegen der Bildfrequenz für die Videoaufnahme

Ein Videoaufnahmegerät unterstützt möglicherweise einen Bereich von Bildfrequenzen. Wenn diese Informationen verfügbar sind, werden die minimale und die maximale Bildfrequenz 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 Aufnahmeformat variieren. Bei größeren Framegrößen kann z. B. die maximale Bildfrequenz reduziert werden.

So legen Sie die Bildfrequenz fest:

  1. Erstellen Sie die Medienquelle für das Aufnahmegerä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. Auflisten der Aufnahmeformate, wie unter Festlegen des Videoaufnahmeformats beschrieben.
  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 Bildfrequenzen 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 IMFMediaTypeHandler::SetCurrentMediaType mit dem geänderten Medientyp auf.

Im folgenden Beispiel wird die Bildfrequenz gleich der maximalen Bildfrequenz festgelegt, die vom Gerät unterstützt wird:

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