如何設定視訊擷取畫面播放速率

視訊擷取裝置可能支援一系列畫面播放速率。 如果此資訊可供使用,最小和最大畫面播放速率會儲存為媒體類型屬性:

屬性 Description
MF_MT_FRAME_RATE_RANGE_MAX 畫面播放速率上限。
MF_MT_FRAME_RATE_RANGE_MIN 最小畫面播放速率。

 

範圍可能會因擷取格式而有所不同。 例如,在較大的畫面大小中,可能會降低最大畫面播放速率。

若要設定畫面播放速率:

  1. 建立擷取裝置的媒體來源。 請參閱 列舉視訊擷取裝置
  2. 在媒體來源上呼叫 IMFMediaSource::CreatePresentationDescriptor 以取得簡報描述元。
  3. 呼叫 IMFPresentationDescriptor::GetStreamDescriptorByIndex 以取得視訊串流的資料流程描述元。
  4. 在資料流程描述元上呼叫 IMFStreamDescriptor::GetMediaTypeHandler
  5. 列舉擷取格式,如 如何設定影片擷取格式中所述。
  6. 從清單中選取所需的輸出格式。
  7. 查詢 MF_MT_FRAME_RATE_RANGE_MAXMF_MT_FRAME_RATE_RANGE_MIN 屬性的媒體類型。 這個值會提供支援的畫面播放速率範圍。 裝置可能支援此範圍內的其他畫面播放速率。
  8. 在媒體類型上設定 MF_MT_FRAME 屬性,以指定所需的畫面播放速率。
  9. 使用修改的媒體類型呼叫 IMFMediaTypeHandler::SetCurrentMediaType

下列範例會將畫面播放速率設定為裝置支援的最大畫面播放速率:

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

影片擷