Étape 5 : ajouter la fonctionnalité vidéo

Cette rubrique est l’étape 5 de la lecture audio/vidéo du didacticiel dans DirectShow. le code complet est présenté dans la rubrique exemple de lecture DirectShow.

Pour vous assurer que la vidéo s’affiche correctement, l’application doit répondre aux messages WM _ Paint, WM _ Sizeet WM _ DISPLAYCHANGE comme suit.

Gérer _ les messages de peinture WM

Lorsque l’application reçoit un message de _ peinture WM , le convertisseur vidéo peut avoir besoin de redessiner la dernière image vidéo. Pour le filtre EVR ( Enhanced Video Renderer ), appelez IMFVideoDisplayControl :: RepaintVideo.

HRESULT CEVR::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pVideoDisplay)
    {
        return m_pVideoDisplay->RepaintVideo();
    }
    else
    {
        return S_OK;
    }
}

Pour le filtre de convertisseur de mixage vidéo 9 (VMR-9), appelez IVMRWindowlessControl9 :: RepaintVideo.

HRESULT CVMR9::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pWindowless)
    {
        return m_pWindowless->RepaintVideo(hwnd, hdc);
    }
    else
    {
        return S_OK;
    }
}

Pour le filtre de convertisseur de mixage vidéo 7 (VMR-7), appelez IVMRWindowlessControl :: RepaintVideo.

HRESULT CVMR7::Repaint(HWND hwnd, HDC hdc)
{
    if (m_pWindowless)
    {
        return m_pWindowless->RepaintVideo(hwnd, hdc);
    }
    else
    {
        return S_OK;
    }
}

Gérer _ les messages de taille WM

Si la taille de la fenêtre vidéo change, avertissez le convertisseur vidéo pour redimensionner la vidéo. Pour EVR, appelez 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);
    }
}

Pour VMR-9, appelez 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);
    }
}

Pour VMR-7, appelez 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);
    }
}

Gérer _ les messages WM DISPLAYCHANGE

Si le mode d’affichage change, vous devez notifier le filtre VMR-9 ou VMR-7. Pour VMR-9, appelez IVMRWindowlessControl9 ::D isplaymodechanged.

HRESULT CVMR9::DisplayModeChanged()
{
    if (m_pWindowless)
    {
        return m_pWindowless->DisplayModeChanged();
    }
    else
    {
        return S_OK;
    }
}

Pour VMR-7, appelez IVMRWindowlessControl ::D isplaymodechanged.

HRESULT CVMR7::DisplayModeChanged()
{
    if (m_pWindowless)
    {
        return m_pWindowless->DisplayModeChanged();
    }
    else
    {
        return S_OK;
    }
}

Le EVR n’a pas besoin d’être notifié lorsque le mode d’affichage change.

étape 6 : gérer les événements de Graph.

Lecture audio/vidéo en DirectShow

DirectShow Exemple de lecture

utilisation du filtre EVR DirectShow

Utilisation du convertisseur de mixage vidéo