Criando o grafo de filtro de DVD
[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.]
Assim como acontece com qualquer aplicativo DirectShow, um aplicativo de reprodução de DVD começa criando um grafo de filtro. O DirectShow fornece os seguintes componentes para reprodução de DVD:
- Construtor de Grafo de DVD. Um objeto auxiliar que constrói o grafo de filtro. Ele expõe a interface IDvdGraphBuilder .
- Filtro do Navegador de DVD . Um filtro DirectShow que manipula a reprodução, a navegação e outros comandos de DVD.
A reprodução de DVD também requer um decodificador MPEG-2. Os decodificadores MPEG-2 de hardware e software estão disponíveis de terceiros. Primeiro, crie uma instância do objeto DVD Graph Builder.
IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL,
CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);
Neste ponto, você pode selecionar e configurar o renderizador de vídeo antes de compilar o restante do grafo. Esta etapa, que é opcional, é descrita mais detalhadamente na próxima seção. Se você omitir essa etapa, o CONSTRUTOR de Grafo de DVD selecionará um renderizador padrão. Em seguida, crie o grafo chamando o método IDvdGraphBuilder::RenderDvdVideoVolume .
AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);
O primeiro parâmetro é o nome de um diretório que contém os arquivos de DVD. Em um disco de DVD, esses arquivos residem em um diretório chamado VIDEO_TS. Se o primeiro parâmetro for NULL, o Construtor de Gráficos de DVD usará a primeira unidade que contém um volume de DVD.
O segundo parâmetro contém vários sinalizadores opcionais para escolher o tipo de decodificador (hardware ou software) e outras opções.
O terceiro parâmetro é uma estrutura AM_DVD_RENDERSTATUS que recebe informações status. Se o método RenderDvdVideoVolume retornar S_FALSE, isso significará que a chamada foi parcialmente bem-sucedida (ou falhou parcialmente, se você for um pessimista). Por exemplo, o método pode falhar ao renderizar o fluxo de subpictura, mesmo que os outros fluxos tenham sido renderizados com êxito. Se o método RenderDvdVideoVolume retornar um código de erro ou o valor S_FALSE, você poderá examinar a estrutura AM_DVD_RENDERSTATUS para obter detalhes sobre o erro.
Em seguida, obtenha um ponteiro para o Gerenciador de Grafo de Filtro chamando IDvdGraphBuilder::GetFiltergraph. Esse método retorna um ponteiro para a interface IGraphBuilder do Gerenciador de Grafo de Filtro.
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
Use o método IDvdGraphBuilder::GetDvdInterface para recuperar interfaces relacionadas a DVD, incluindo o seguinte:
- IDvdControl2. Controla comandos de reprodução e DVD
- IDvdInfo2. Retorna informações sobre o estado atual do Navegador de DVD.
- IAMLine21Decoder. Controles fechados legenda exibição. A exibição de legenda fechada está habilitada por padrão. Para desabilitá-lo, chame IAMLine21Decoder::SetServiceState com o sinalizador AM_L21_CCSTATE_Off.
- IBasicAudio. Controla o volume e o equilíbrio de áudio.
Por exemplo, o código a seguir retorna a interface IDvdControl2 .
IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);
A maneira recomendada de criar o grafo de filtro de reprodução de DVD é fazer com que um objeto do Construtor de Grafo de DVD faça isso automaticamente. Essa abordagem é demonstrada abaixo e no aplicativo de exemplo de DVD. Se você precisar criar o grafo de filtro de DVD manualmente, poderá fazer isso seguindo as regras básicas de criação de grafo discutidas em outro lugar na documentação do DirectShow. Geralmente, você não deve adicionar, remover, conectar ou desconectar filtros individuais manualmente no grafo criado pelo Construtor de Grafos de DVD, pois isso pode confundir o código de limpeza.
Configurando o Renderizador de Vídeo
O DirectShow fornece vários filtros de renderizador de vídeo. Antes de criar o grafo, você pode escolher qual renderizador de vídeo você prefere. Selecione o renderizador chamando IDvdGraphBuilder::GetDvdInterface e solicitando uma interface específica para esse renderizador:
- Filtro do Mixer de Sobreposição: IDDrawExclModeVideo.
- Renderizador de Combinação de Vídeo 7 (VMR-7): IVMRFilterConfig.
- Renderizador de Mixagem de Vídeo 9 (VMR-9): IVMRFilterConfig9.
- Renderizador de Vídeo Avançado (EVR): IEVRFilterConfig.
Se você solicitar qualquer uma dessas interfaces antes de criar o grafo de filtro, o Construtor de Grafos de DVD criará o renderizador de vídeo correspondente. Posteriormente, quando você compilar o grafo, o Construtor de Grafos de DVD tentará usar esse renderizador. No entanto, se ele não puder criar o grafo usando o renderizador selecionado, ele poderá alternar para outro renderizador. Por exemplo, o decodificador MPEG-2 pode não ser compatível com o filtro VMR, nesse caso, o Construtor de Gráficos de DVD seria o padrão para o Mixer de Sobreposição.
Essas interfaces também oferecem a você a chance de configurar o renderizador antes que ele seja conectado ao decodificador. Por exemplo, você pode definir a VMR para usar o modo sem janelas em vez do modo de janela padrão. Para obter mais informações sobre renderizadores de vídeo, consulte o tópico Sobre Renderização de Vídeo no DirectShow.
No Windows XP e posteriores, o Construtor de Grafos de DVD sempre usa o Renderizador de Combinação de Vídeo 7 (VMR-7), a menos que:
- As interfaces de consultas do chamador encontraram apenas o Mixer de Sobreposição, como IMixerPinConfig2. Isso envia uma dica para o DVD Graph Builder de que o aplicativo deseja usar o Mixer de Sobreposição e não a VMR. Reprodutor Multimídia do Windows também tem uma opção de caixa de diálogo para forçar o uso do Mixer de Sobreposição.
- O decodificador instalado não é compatível com VMR. Durante a criação do grafo, a nova interface IAMDecoderCaps é usada para marcar para o suporte à VMR do decodificador. Se isso não estiver presente, o Construtor de Gráficos de DVD usará o Mixer de Sobreposição.
- Ao usar um decodificador de hardware, o decodificador não pode se conectar ao VPM ( Gerenciador de Portas de Vídeo ). Se um decodificador de hardware não puder usar o VPM, ele não poderá usar a VMR e, portanto, o Construtor de Grafos de DVD tentará criar um grafo usando o Mixer de Sobreposição.
- A cartão de exibição é conhecida por não ter recursos e/ou recursos suficientes para dar suporte à VMR, mas não relata corretamente isso no driver. (Alguns casos conhecidos são especificamente excluídos pelo Construtor de Gráficos de DVD.)
- A conexão entre o decodificador e a VMR falha por qualquer motivo, geralmente devido à falta de VRAM para criar as superfícies necessárias. Nesses casos, o CONSTRUTOR de Grafo de DVD desativa o uso de VMR e tenta usar o Mixer de Sobreposição para criar um grafo.
Modo com janelas
No modo de janela (Overlay Mixer ou VMR), o renderizador cria sua própria janela de vídeo. Para tornar essa janela um filho da janela do aplicativo, chame IVideoWindow::p ut_Owner com um identificador para o aplicativo. Chame também IVideoWindow::p ut_WindowStyle para definir os estilos de WS_CHILD e WS_CLIPSIBLINGS na janela de vídeo do renderizador. Para obter mensagens do mouse da janela de vídeo do renderizador, chame IVideoWindow::p ut_MessageDrain com um identificador para a janela do aplicativo. Esse método configura um "dreno de mensagens" – a janela de vídeo encaminha todas as mensagens do mouse recebidas para a janela de esvaziamento de mensagens.
pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;
O dreno de mensagens torna a seleção de botões de menu de DVD um pouco complicada. Supondo que a janela de vídeo não preencha toda a área de cliente do aplicativo, alguns eventos do mouse ficarão fora da janela de vídeo. Quando você obtém um evento do mouse de dentro da janela de vídeo, você deve processá-lo para navegação no menu DVD. Eventos do mouse de fora da janela de vídeo não devem ser processados. Com o esvaziamento de mensagens, não há como distinguir entre os dois. Além disso, as coordenadas para eventos do mouse da janela de vídeo são relativas à área de cliente da janela de vídeo; mas os eventos do mouse de fora da janela de vídeo são relativos à área de cliente do aplicativo.
Modo sem janelas
O modo sem janela evita os problemas com mensagens do mouse completamente. Você não precisa de um esvaziamento de mensagens, pois a VMR (ou EVR) não cria sua própria janela no modo sem janelas. Em vez disso, ele se baseia diretamente na janela do aplicativo. Se o retângulo de destino for menor que a área do cliente do aplicativo, o Navegador de DVD levará isso em conta quando calcula as posições do botão DVD. Portanto, quando você recebe uma mensagem do mouse, pode passar as coordenadas diretamente para o Navegador de DVD, conforme descrito na seção Navegação de Menu.
Tópicos relacionados