Bagikan melalui


Menggunakan DMO di DirectShow

[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.]

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

Karena DMO digabungkan oleh filter, aplikasi dapat mengajukan kueri ke 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 antarmukaIDMOWrapperFilter.
  3. Panggil metode IDMOWrapperFilter::Init. Tentukan CLSID dari DMO dan GUID dari kategori DMO. Untuk daftar kategori DMO, silakan lihat GUID DMO .

Kode berikut menunjukkan langkah-langkah berikut:

// 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();
}

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

Menggunakan Enumerator Perangkat Sistem dengan DMOs

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

Label Nilai
Kategori DMO Padanan DirectShow
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOKATEGORI_DEKODER_VIDEO CLSID_LegacyAmFilterCategory

 

Enumerator Perangkat Sistem mengembalikan sebuah 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 DMOs