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:

  1. Buat sumber media untuk perangkat pengambilan. Lihat Menghitung perangkat pengambilan video.
  2. Panggil IMFMediaSource::CreatePresentationDescriptor pada sumber media untuk mendapatkan deskriptor presentasi.
  3. Panggil IMFPresentationDescriptor::GetStreamDescriptorByIndex untuk mendapatkan deskriptor streaming untuk aliran video.
  4. Panggil IMFStreamDescriptor::GetMediaTypeHandler pada deskriptor aliran.
  5. Hitung format pengambilan, seperti yang dijelaskan dalam Cara Mengatur Format Pengambilan Video.
  6. Pilih format output yang diinginkan dari daftar.
  7. 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.
  8. Atur atribut MF_MT_FRAME pada jenis media untuk menentukan kecepatan bingkai yang diinginkan.
  9. 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;
}

Pengambilan Video