Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Aplikacje oparte na DirectShow mogą używać obiektów DMO w grafie filtru za pośrednictwem filtru opakowującego DMO. Ten filtr agreguje DMO i obsługuje wszystkie szczegóły użycia DMO, takie jak przekazywanie danych do i z DMO, przydzielanie obiektów IMediaBuffer itd.
Ponieważ DMO jest agregowane przez filtr, aplikacja może wysyłać zapytania do filtru dotyczące dowolnych interfejsów COM, które udostępnia DMO. Jednak aplikacja powinna zezwolić filtrowi na obsługę wszystkich operacji przesyłania strumieniowego na DMO. Na przykład nie ustawiaj typów multimediów, nie przetwarzaj buforów, nie opróżniaj DMO, nie blokuj DMO, nie włączaj ani wyłączaj kontroli jakości i nie ustawiaj optymalizacji wideo.
Jeśli znasz identyfikator klasy (CLSID) określonego DMO, którego chcesz użyć, możesz zainicjować filtr powłoki DMO za pomocą tego DMO w następujący sposób:
- Wywołaj CoCreateInstance, aby utworzyć filtr Wrapper DMO.
- Wykonaj zapytanie dotyczące filtru otoki DMO dla interfejsu IDMOWrapperFilter.
- Wywołaj metodę IDMOWrapperFilter::Init. Określ CLSID DMO i GUID kategorii DMO. Aby uzyskać listę kategorii DMO, zobacz identyfikatory DMO GUID.
Poniższy kod przedstawia następujące kroki:
// 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();
}
Funkcja DMOEnum wylicza obiekty DMO w rejestrze. Ta funkcja używa innego zestawu identyfikatorów GUID kategorii z tych używanych dla filtrów DirectShow.
Używanie enumeratora urządzeń systemowych z DMO
Zamiast bezpośrednio tworzyć DMO, możesz użyć System Device Enumerator, który może wyliczać dowolną kategorię DMO obsługiwaną przez metodę DMOEnum. Moduł wyliczający urządzenia systemowego zawiera również obiekty DMO, gdy wylicza niektóre kategorie filtrów DirectShow. W poniższej tabeli przedstawiono mapowanie między kategoriami DMO i kategoriami DirectShow.
| Etykieta | Wartość |
|---|---|
| Kategoria DMO | Odpowiednik DirectShow |
| DMOCATEGORY_AUDIO_ENCODER | CLSID_AudioCompressorCategory |
| DMOCATEGORY_AUDIO_DECODER | CLSID_LegacyAmFilterCategory |
| DMOCATEGORY_VIDEO_ENCODER | CLSID_VideoCompressorCategory |
| DMOCATEGORY_VIDEO_DECODER | CLSID_LegacyAmFilterCategory |
Moduł wyliczający urządzenia systemowe zwraca listę obiektów monikerów. Jeśli moniker reprezentuje DMO, metoda IMoniker::BindToObject automatycznie tworzy filtr DMO Wrapper i inicjuje go za pomocą tego DMO. W związku z tym fakt, że DMO jest zaangażowane, jest przejrzysty dla aplikacji. Aby uzyskać więcej informacji na temat korzystania z modułu wyliczającego urządzenia systemowego, zobacz Using the System Device Enumerator.
ograniczenia
Istnieją pewne ograniczenia dotyczące używania obiektów DMO w programie DirectShow:
- Filtr otoczki DMO nie obsługuje obiektów DMO z zerowymi wejściami, wieloma wejściami lub zerowymi wyjściami.
- Wszystkie połączenia pinów w filtrze opakowania DMO używają interfejsu IMemInputPin.
- Usługi edycji DirectShow nie obsługują efektów ani przejść bazujących na DMO.
Tematy pokrewne