如何設定視訊擷取畫面播放速率
視訊擷取裝置可能支援一系列畫面播放速率。 如果此資訊可供使用,最小和最大畫面播放速率會儲存為媒體類型屬性:
屬性 | Description |
---|---|
MF_MT_FRAME_RATE_RANGE_MAX | 畫面播放速率上限。 |
MF_MT_FRAME_RATE_RANGE_MIN | 最小畫面播放速率。 |
範圍可能會因擷取格式而有所不同。 例如,在較大的畫面大小中,可能會降低最大畫面播放速率。
若要設定畫面播放速率:
- 建立擷取裝置的媒體來源。 請參閱 列舉視訊擷取裝置。
- 在媒體來源上呼叫 IMFMediaSource::CreatePresentationDescriptor 以取得簡報描述元。
- 呼叫 IMFPresentationDescriptor::GetStreamDescriptorByIndex 以取得視訊串流的資料流程描述元。
- 在資料流程描述元上呼叫 IMFStreamDescriptor::GetMediaTypeHandler 。
- 列舉擷取格式,如 如何設定影片擷取格式中所述。
- 從清單中選取所需的輸出格式。
- 查詢 MF_MT_FRAME_RATE_RANGE_MAX 和 MF_MT_FRAME_RATE_RANGE_MIN 屬性的媒體類型。 這個值會提供支援的畫面播放速率範圍。 裝置可能支援此範圍內的其他畫面播放速率。
- 在媒體類型上設定 MF_MT_FRAME 屬性,以指定所需的畫面播放速率。
- 使用修改的媒體類型呼叫 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;
}
相關主題