Paso 5: Agregar funcionalidad de vídeo
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Este tema es el paso 5 del tutorial Reproducción de audio y vídeo en DirectShow. El código completo se muestra en el tema Ejemplo de reproducción de DirectShow.
Para asegurarse de que el vídeo se muestra correctamente, la aplicación debe responder a WM_PAINT, WM_SIZE y WM_DISPLAYCHANGE mensajes como se indica a continuación.
Controlar mensajes de WM_PAINT
Cuando la aplicación recibe un mensaje de WM_PAINT , es posible que el representador de vídeo tenga que volver a dibujar el último fotograma de vídeo. Para el filtro Enhanced Video Renderer (EVR), llame a IMFVideoDisplayControl::RepaintVideo.
HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
if (m_pVideoDisplay)
{
return m_pVideoDisplay->RepaintVideo();
}
else
{
return S_OK;
}
}
Para el filtro de representador de mezcla de vídeo 9 (VMR-9), llame a IVMRWindowlessControl9::RepaintVideo.
HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Para el filtro del representador de mezcla de vídeos 7 (VMR-7), llame a IVMRWindowlessControl::RepaintVideo.
HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
if (m_pWindowless)
{
return m_pWindowless->RepaintVideo(hwnd, hdc);
}
else
{
return S_OK;
}
}
Controlar mensajes de WM_SIZE
Si cambia el tamaño de la ventana de vídeo, notifique al representador de vídeo que cambie el tamaño del vídeo. Para el EVR, llame a 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 VMR-9, llame a 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 VMR-7, llame a 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);
}
}
Controlar mensajes de WM_DISPLAYCHANGE
Si el modo de visualización cambia, debe notificar al filtro VMR-9 o VMR-7. Para VMR-9, llame a IVMRWindowlessControl9::D isplayModeChanged.
HRESULT CVMR9::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
Para VMR-7, llame a IVMRWindowlessControl::D isplayModeChanged.
HRESULT CVMR7::DisplayModeChanged()
{
if (m_pWindowless)
{
return m_pWindowless->DisplayModeChanged();
}
else
{
return S_OK;
}
}
No es necesario que se notifique al EVR cuando cambie el modo de presentación.
Siguiente: Paso 6: Controlar eventos de Graph.
Temas relacionados