Étape 5 : Ajouter une fonctionnalité vidéo
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Cette rubrique est l’étape 5 du didacticiel Lecture audio/vidéo dans DirectShow. Le code complet est présenté dans la rubrique Exemple de lecture DirectShow.
Pour s’assurer que la vidéo s’affiche correctement, l’application doit répondre aux messages WM_PAINT, WM_SIZE et WM_DISPLAYCHANGE comme suit.
Gérer les messages WM_PAINT
Lorsque l’application reçoit un message WM_PAINT , 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 du renderer 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 du 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 WM_SIZE
Si la taille de la fenêtre vidéo change, indiquez au convertisseur vidéo de redimensionner la vidéo. Pour l’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;
}
}
L’EVR n’a pas besoin d’être averti lorsque le mode d’affichage change.
Suivant : Étape 6 : Gérer les événements de graphique.
Rubriques connexes