Partilhar via


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.

Reprodução de áudio/vídeo no DirectShow

Exemplo de reprodução do DirectShow

Usando o filtro EVR do DirectShow

Usando o Renderizador de Combinação de Vídeo