Bagikan melalui


Menggunakan DMO di DirectShow

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan 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 Audio/Video Capture 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.]

Aplikasi berdasarkan DirectShow dapat menggunakan DMO dalam grafik filter, melalui filter Pembungkus DMO . Filter ini menggabungkan DMO dan menangani semua detail penggunaan DMO, seperti meneruskan data ke dan dari DMO, mengalokasikan objek IMediaBuffer , dan sebagainya.

Karena DMO diagregasi oleh filter, aplikasi dapat meminta filter untuk antarmuka COM apa pun yang diekspos DMO. Namun, aplikasi harus membiarkan filter menangani semua operasi streaming pada DMO. Misalnya, jangan mengatur jenis media, memproses buffer apa pun, menghapus DMO, mengunci DMO, mengaktifkan atau menonaktifkan kontrol kualitas, atau mengatur pengoptimalan video.

Jika Anda mengetahui pengidentifikasi kelas (CLSID) dari DMO tertentu yang ingin Anda gunakan, Anda dapat menginisialisasi filter Pembungkus DMO dengan DMO tersebut, sebagai berikut:

  1. Panggil CoCreateInstance untuk membuat filter Pembungkus DMO.
  2. Kueri filter Pembungkus DMO untuk antarmuka IDMOWrapperFilter .
  3. Panggil metode IDMOWrapperFilter::Init . Tentukan CLSID DMO dan GUID kategori DMO. Untuk daftar kategori DMO, lihat GUID DMO.

Kode berikut menunjukkan langkah-langkah ini:

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

Fungsi DMOEnum menghitung DMO dalam registri. Fungsi ini menggunakan serangkaian GUID kategori yang berbeda dari yang digunakan untuk filter DirectShow.

Menggunakan Enumerator Perangkat Sistem dengan DMO

Alih-alih membuat DMO secara langsung, Anda dapat menggunakan System Device Enumerator, yang dapat menghitung kategori DMO apa pun yang didukung oleh metode DMOEnum . Enumerator Perangkat Sistem juga mencakup DMO ketika menghitung kategori filter DirectShow tertentu. Tabel berikut ini memperlihatkan pemetaan antara kategori DMO dan kategori DirectShow.

Label Nilai
Kategori DMO DirectShow Setara
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

Enumerator Perangkat Sistem mengembalikan daftar objek moniker. Jika moniker mewakili DMO, metode IMoniker::BindToObject secara otomatis membuat filter Pembungkus DMO dan menginisialisasinya dengan DMO tersebut. Dengan demikian, fakta bahwa DMO terlibat transparan terhadap aplikasi. Untuk informasi selengkapnya tentang menggunakan Enumerator Perangkat Sistem, lihat Menggunakan Enumerator Perangkat Sistem.

Batasan

Ada beberapa batasan saat menggunakan DMO di DirectShow:

  • Filter Pembungkus DMO tidak mendukung DMO dengan input nol, beberapa input, atau output nol.
  • Semua koneksi pin pada Filter Pembungkus DMO menggunakan antarmuka IMemInputPin .
  • DirectShow Editing Services tidak mendukung efek atau transisi berbasis DMO.

Menggunakan DMO