So legen Sie die Videoaufnahmeframerate fest

Ein Videoaufnahmegerät unterstützt möglicherweise einen Bereich von Frameraten. Wenn diese Informationen verfügbar sind, werden die mindest- und maximalen Frameraten als Medientypattribute gespeichert:

attribute BESCHREIBUNG
MF_MT_FRAME_RATE_RANGE_MAX Maximale Framerate.
MF_MT_FRAME_RATE_RANGE_MIN Mindestrahmenrate.

 

Der Bereich kann je nach Aufnahmeformat variieren. Beispielsweise kann die maximale Framerate bei größeren Framegrößen reduziert werden.

So legen Sie die Framerate fest:

  1. Erstellen Sie die Medienquelle für das Aufnahmegerät. Siehe Aufzählen von Videoaufnahmegeräten.
  2. Rufen Sie IMFMediaSource::CreatePresentationDescriptor auf der 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 auf dem Streamdescriptor auf.
  5. Enumerieren Sie die Aufnahmeformate, wie in der Anleitung zum Festlegen des Videoaufnahmeformats beschrieben.
  6. Wählen Sie das gewünschte Ausgabeformat aus der Liste aus.
  7. Abfragen des Medientyps für die attribute MF_MT_FRAME_RATE_RANGE_MAX und MF_MT_FRAME_RATE_RANGE_MIN . Diese Werte geben den Bereich der unterstützten Frameraten. Das Gerät kann andere Frameraten innerhalb dieses Bereichs unterstützen.
  8. Legen Sie das MF_MT_FRAME-Attribut für den Medientyp fest, um die gewünschte Framerate anzugeben.
  9. Rufen Sie IMFMediaTypeHandler::SetCurrentMediaType mit dem geänderten Medientyp auf.

Im folgenden Beispiel wird die Framerate gleich der maximalen Framerate 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