Bagikan melalui


Cara Mengatur Format Pengambilan Video

Perangkat penangkapan video mungkin mendukung beberapa format pengambilan. Format biasanya berbeda berdasarkan jenis kompresi, ruang warna (YUV atau RGB), ukuran bingkai, atau kecepatan bingkai.

Daftar format yang didukung terkandung dalam deskriptor presentasi. Untuk informasi selengkapnya, lihat Deskriptor Presentasi.

Untuk menghitung format yang didukung:

  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. Panggil IMFMediaTypeHandler::GetMediaTypeCount untuk mendapatkan jumlah format yang didukung.
  6. Dalam perulangan, panggil IMFMediaTypeHandler::GetMediaTypeByIndex untuk mendapatkan setiap format. Format diwakili oleh jenis media. Untuk informasi selengkapnya, lihat Jenis Media Video.

Contoh berikut menghitung format pengambilan untuk perangkat:

HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
    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(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    DWORD cTypes = 0;
    hr = pHandler->GetMediaTypeCount(&cTypes);
    if (FAILED(hr))
    {
        goto done;
    }

    for (DWORD i = 0; i < cTypes; i++)
    {
        hr = pHandler->GetMediaTypeByIndex(i, &pType);
        if (FAILED(hr))
        {
            goto done;
        }

        LogMediaType(pType);
        OutputDebugString(L"\n");

        SafeRelease(&pType);
    }

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

Fungsi yang LogMediaType digunakan dalam contoh ini tercantum dalam topik Kode Penelusuran Kesalahan Jenis Media.

Untuk mengatur format pengambilan:

  1. Dapatkan penunjuk ke antarmuka IMFMediaTypeHandler , seperti yang ditunjukkan pada contoh sebelumnya.
  2. Panggil IMFMediaTypeHandler::GetMediaTypeByIndex untuk mendapatkan format yang diinginkan, yang ditentukan oleh indeks.
  3. Panggil IMFMediaTypeHandler::SetCurrentMediaType untuk mengatur format.

Jika Anda tidak mengatur format pengambilan, perangkat akan menggunakan format defaultnya.

Contoh berikut mengatur format pengambilan:

HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
    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(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->SetCurrentMediaType(pType);

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

Urutan di mana format dikembalikan tergantung pada perangkat. Biasanya, mereka dikelompokkan terlebih dahulu berdasarkan jenis kompresi atau ruang warna; dan kemudian dari ukuran bingkai terkecil hingga ukuran bingkai terbesar dalam setiap grup.

Kecepatan bingkai ditangani sedikit berbeda dari atribut format lainnya. Untuk informasi selengkapnya, lihat Cara Mengatur Kecepatan Bingkai Pengambilan Video.

Catatan

Di beberapa perangkat, daftar format akan berisi entri duplikat untuk setiap format. Misalnya, jika perangkat mendukung 15 format pengambilan yang berbeda, daftar akan berisi 30 entri. Dalam setiap pasangan, salah satu jenis media akan memiliki atribut MF_MT_AM_FORMAT_TYPE sama dengan FORMAT_VideoInfo, dan yang lain akan memiliki MF_MT_AM_FORMAT_TYPE sama dengan FORMAT_VideoInfo2. (Kedua nilai ini ditentukan dalam file header uuids.h.) Jenis kedua mungkin juga berisi informasi warna tambahan (Informasi Warna Diperluas) atau memperlihatkan nilai yang berbeda untuk interlacing (MF_MT_INTERLACE_MODE). Jenis duplikat ini ada untuk mendukung aplikasi DirectShow yang lebih lama. Dalam aplikasi Media Foundation, Anda harus mengabaikan jenis FORMAT_VideoInfo setiap kali jenis FORMAT_VideoInfo2 duplikat dicantumkan.

 

Pengambilan Video