Cara Mengatur Frame Rate Pengambilan Video
Perangkat penangkapan video mungkin mendukung berbagai kecepatan bingkai. Jika informasi ini tersedia, kecepatan bingkai minimum dan maksimum disimpan sebagai atribut jenis media:
Atribut | Deskripsi |
---|---|
MF_MT_FRAME_RATE_RANGE_MAX | Kecepatan bingkai maksimum. |
MF_MT_FRAME_RATE_RANGE_MIN | Kecepatan bingkai minimum. |
Rentang dapat bervariasi tergantung pada format pengambilan. Misalnya, pada ukuran bingkai yang lebih besar, kecepatan bingkai maksimum mungkin berkurang.
Untuk mengatur kecepatan bingkai:
- Buat sumber media untuk perangkat pengambilan. Lihat Menghitung perangkat pengambilan video.
- Panggil IMFMediaSource::CreatePresentationDescriptor pada sumber media untuk mendapatkan deskriptor presentasi.
- Panggil IMFPresentationDescriptor::GetStreamDescriptorByIndex untuk mendapatkan deskriptor streaming untuk aliran video.
- Panggil IMFStreamDescriptor::GetMediaTypeHandler pada deskriptor aliran.
- Hitung format pengambilan, seperti yang dijelaskan dalam Cara Mengatur Format Pengambilan Video.
- Pilih format output yang diinginkan dari daftar.
- Kueri jenis media untuk atribut MF_MT_FRAME_RATE_RANGE_MAX dan MF_MT_FRAME_RATE_RANGE_MIN . Nilai ini memberikan rentang kecepatan bingkai yang didukung. Perangkat mungkin mendukung kecepatan bingkai lain dalam rentang ini.
- Atur atribut MF_MT_FRAME pada jenis media untuk menentukan kecepatan bingkai yang diinginkan.
- Panggil IMFMediaTypeHandler::SetCurrentMediaType dengan jenis media yang dimodifikasi.
Contoh berikut mengatur kecepatan bingkai yang sama dengan kecepatan bingkai maksimum yang didukung perangkat:
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;
}
Topik terkait