Menghitung Efek dan Transisi

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

[API ini tidak didukung dan dapat diubah atau tidak tersedia di masa mendatang.]

DirectShow menyediakan objek System Device Enumerator untuk menghitung perangkat. Anda dapat menggunakannya untuk mengambil moniker untuk efek atau transisi yang diinstal pada sistem pengguna.

Enumerator perangkat sistem mengekspos antarmuka ICreateDevEnum . Ini mengembalikan enumerator kategori untuk kategori perangkat tertentu. Enumerator kategori, pada gilirannya, mengekspos antarmuka IEnumMoniker dan mengembalikan moniker untuk setiap perangkat dalam kategori. Untuk diskusi terperinci tentang penggunaan ICreateDevEnum, lihat Menghitung Perangkat dan Filter. Berikut ini adalah ringkasan singkat, khusus untuk DirectShow Editing Services.

Untuk menghitung efek atau transisi, lakukan langkah-langkah berikut.

  1. Buat instans enumerator perangkat sistem.
  2. Panggil metode ICreateDevEnum::CreateClassEnumerator untuk mengambil enumerator kategori. Kategori ditentukan oleh pengidentifikasi kelas (CLSID). Gunakan CLSID_VideoEffects1Category untuk efek atau CLSID_VideoEffects2Category untuk transisi.
  3. Panggil IEnumMoniker::Selanjutnya untuk mengambil setiap moniker dalam enumerasi.
  4. Untuk setiap moniker, panggil IMoniker::BindToStorage untuk mengambil tas properti terkait.

Tas properti berisi nama yang mudah diingat dan pengidentifikasi unik global (GUID) untuk efek atau transisi. Aplikasi dapat menampilkan daftar nama yang mudah diingat lalu mendapatkan GUID yang sesuai.

Contoh kode berikut mengilustrasikan langkah-langkah ini.

ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;

// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
    CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

// Create an enumerator for the video effects category.
hr = pCreateDevEnum->CreateClassEnumerator(
    CLSID_VideoEffects1Category,  // Video effects category. 
    &pEnumMoniker, 0);               

// Note: Use CLSID_VideoEffects2Category for video transitions.

if (hr == S_OK)  // S_FALSE means the category is empty.
{
    // Enumerate each video effect.
    IMoniker *pMoniker;
    while (S_OK == pEnumMoniker->Next(1, &pMoniker, NULL))
    {
        IPropertyBag *pBag;
        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
            (void **)&pBag);
        if(FAILED(hr))
        {
            pMoniker->Release();
            continue; // Maybe the next one will work.
        }
        VARIANT var;
        VariantInit(&var);
        hr = pBag->Read(OLESTR("FriendlyName"), &var, NULL);
        if (SUCCEEDED(hr))
        {
            if ( ... )  // Check if var.bstrVal is the name you want.
            {
                VARIANT var2;
                GUID guid;
                var2.vt = VT_BSTR;
                pBag->Read(OLESTR("guid"), &var2, NULL);
                CLSIDFromString(var2.bstrVal, &guid);
                VariantClear(&var2);
                // GUID is now the CLSID for the effect.
            }
        }
        VariantClear(&var);
        pBag->Release();
        pMoniker->Release();
    }
    pEnumMoniker->Release();
}
pCreateDevEnum->Release();

Bekerja dengan Efek dan Transisi