Gestion des événements de repaint dans la capture 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 dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est 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.]

Si vous créez un graphique de capture vidéo sans utiliser l’interface ICaptureGraphBuilder2 et que vous affichez un aperçu de la vidéo à l’aide de l’ancien filtre Video Renderer, vous devez remplacer la gestion par défaut des événements EC_REPAINT . Interrogez le Gestionnaire de graphes de filtre pour l’interface IMediaEvent et appelez la méthode IMediaEvent::CancelDefaultHandling avec la valeur EC_REPAINT :

IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
    pEvent->CancelDefaultHandling (EC_REPAINT);
    pEvent->Release();
}

Cela empêche une erreur possible qui peut endommager votre fichier de capture. Si l’utilisateur couvre et découvre la fenêtre d’aperçu, le filtre Video Renderer reçoit un message WM_PAINT. Par défaut, le convertisseur vidéo demande une nouvelle image, et le Gestionnaire de graphes de filtre suspend le graphe afin d’en faire une autre image vidéo. Si cela se produit pendant que le graphique écrit un fichier, le fichier est endommagé. La substitution du comportement de EC_REPAINT par défaut empêche le convertisseur de demander une nouvelle image.

Vous n’avez pas besoin d’effectuer cette étape si vous utilisez l’interface ICaptureGraphBuilder2 , car Capture Graph Builder le fait automatiquement pour vous. En outre, il n’est pas obligatoire si vous utilisez le convertisseur de mixage vidéo (VMR) pour la préversion. Le vmR a toujours le frame le plus récent disponible, il n’envoie donc pas d’événements EC_REPAINT.

Rubriques de capture avancée

Notification d’événement dans DirectShow