Usando DMOs no DirectShow
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Aplicativos baseados no DirectShow podem usar DMOs em um grafo de filtro por meio do filtro Wrapper de DMO . Esse filtro agrega um DMO e manipula todos os detalhes do uso do DMO, como passar dados de e para o DMO, alocar objetos IMediaBuffer e assim por diante.
Como o DMO é agregado pelo filtro, o aplicativo pode consultar o filtro para quaisquer interfaces COM expostas pelo DMO. No entanto, o aplicativo deve permitir que o filtro manipule todas as operações de streaming no DMO. Por exemplo, não defina tipos de mídia, processe buffers, libere o DMO, bloqueie o DMO, habilite ou desabilite o controle de qualidade ou defina otimizações de vídeo.
Se você souber o CLSID (identificador de classe) de um DMO específico que deseja usar, poderá inicializar o filtro Wrapper de DMO com esse DMO, da seguinte maneira:
- Chame CoCreateInstance para criar o filtro Wrapper de DMO.
- Consulte o filtro Wrapper de DMO para a interface IDMOWrapperFilter .
- Chame o método IDMOWrapperFilter::Init . Especifique o CLSID do DMO e o GUID da categoria do DMO. Para obter uma lista de categorias de DMO, consulte GUIDs de DMO.
O código a seguir mostra essas etapas:
// 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();
}
A função DMOEnum enumera DMOs no registro. Essa função usa um conjunto diferente de GUIDs de categoria dos usados para filtros DirectShow.
Usando o Enumerador de Dispositivo do Sistema com DMOs
Em vez de criar um DMO diretamente, você pode usar o Enumerador de Dispositivo do Sistema, que pode enumerar qualquer categoria DMO compatível com o método DMOEnum . O Enumerador de Dispositivo do Sistema também inclui DMOs quando enumera determinadas categorias de filtro DirectShow. A tabela a seguir mostra o mapeamento entre categorias de DMO e categorias do DirectShow.
Rótulo | Valor |
---|---|
Categoria DMO | Equivalente do DirectShow |
DMOCATEGORY_AUDIO_ENCODER | CLSID_AudioCompressorCategory |
DMOCATEGORY_AUDIO_DECODER | CLSID_LegacyAmFilterCategory |
DMOCATEGORY_VIDEO_ENCODER | CLSID_VideoCompressorCategory |
DMOCATEGORY_VIDEO_DECODER | CLSID_LegacyAmFilterCategory |
O Enumerador de Dispositivo do Sistema retorna uma lista de objetos moniker. Se o moniker representar um DMO, o método IMoniker::BindToObject criará automaticamente o filtro Wrapper de DMO e o inicializará com esse DMO. Portanto, o fato de um DMO estar envolvido é transparente para o aplicativo. Para obter mais informações sobre como usar o Enumerador de Dispositivo do Sistema, consulte Usando o Enumerador de Dispositivo do Sistema.
Limitações
Há algumas limitações ao usar DMOs no DirectShow:
- O filtro Wrapper de DMO não dá suporte a DMOs com zero entradas, várias entradas ou saídas zero.
- Todas as conexões de fixação no Filtro de Wrapper de DMO usam a interface IMemInputPin .
- Os Serviços de Edição do DirectShow não dão suporte a efeitos ou transições baseados em DMO.
Tópicos relacionados