Etapa 5: Adicionar funcionalidade de vídeo
[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.]
Este tópico é a etapa 5 do tutorial Reprodução de Áudio/Vídeo no DirectShow. O código completo é mostrado no tópico Exemplo de Reprodução do DirectShow.
Para garantir que o vídeo seja exibido corretamente, o aplicativo deve responder a mensagens WM_PAINT, WM_SIZE e WM_DISPLAYCHANGE da seguinte maneira.
Manipular mensagens de WM_PAINT
Quando o aplicativo recebe uma mensagem WM_PAINT , o renderizador de vídeo pode precisar redesenhar o último quadro de vídeo. Para o filtro EVR ( Renderizador de Vídeo Avançado ), chame IMFVideoDisplayControl::RepaintVideo.
HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
if (m_pVideoDisplay)
{
return m_pVideoDisplay->RepaintVideo();
}
else
{
return S_OK;
}
}
Para o Filtro do Renderizador de Combinação de Vídeo 9 (VMR-9), chame IVMRWindowlessControl9::RepaintVideo.
HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Para o Filtro do Renderizador de Combinação de Vídeo 7 (VMR-7), chame IVMRWindowlessControl::RepaintVideo.
HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Manipular mensagens de WM_SIZE
Se o tamanho da janela de vídeo for alterado, notifique o renderizador de vídeo para redimensionar o vídeo. Para o EVR, chame IMFVideoDisplayControl::SetVideoPosition.
HRESULT CEVR::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pVideoDisplay == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pVideoDisplay->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pVideoDisplay->SetVideoPosition(NULL, &rc);
}
}
Para a VMR-9, chame IVMRWindowlessControl9::SetVideoPosition.
HRESULT CVMR9::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Para a VMR-7, chame IVMRWindowlessControl::SetVideoPosition.
HRESULT CVMR7::UpdateVideoWindow(HWND hwnd, const LPRECT prc)
{
if (m_pWindowless == NULL)
{
return S_OK; // no-op
}
if (prc)
{
return m_pWindowless->SetVideoPosition(NULL, prc);
}
else
{
RECT rc;
GetClientRect(hwnd, &rc);
return m_pWindowless->SetVideoPosition(NULL, &rc);
}
}
Manipular mensagens de WM_DISPLAYCHANGE
Se o modo de exibição for alterado, você deverá notificar o filtro VMR-9 ou VMR-7. Para a VMR-9, chame IVMRWindowlessControl9::D isplayModeChanged.
HRESULT CVMR9::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
Para a VMR-7, chame IVMRWindowlessControl::D isplayModeChanged.
HRESULT CVMR7::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
O EVR não precisa ser notificado quando o modo de exibição é alterado.
Próximo: Etapa 6: Manipular eventos do Graph.
Tópicos relacionados