Behandeln von Repaint-Ereignissen in der Videoaufnahme
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Wenn Sie ein Videoaufnahmediagramm erstellen, ohne die ICaptureGraphBuilder2-Schnittstelle zu verwenden, und Sie das Video mit dem alten Video Renderer-Filter in der Vorschau anzeigen, sollten Sie die Standardbehandlung für EC_REPAINT Ereignisse überschreiben. Fragen Sie den Filter Graph-Manager nach der IMediaEvent-Schnittstelle ab, und rufen Sie die IMediaEvent::CancelDefaultHandling-Methode mit dem Wert EC_REPAINT auf:
IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
pEvent->CancelDefaultHandling (EC_REPAINT);
pEvent->Release();
}
Dadurch wird ein möglicher Fehler verhindert, der Ihre Erfassungsdatei beschädigen kann. Wenn der Benutzer das Vorschaufenster abdeckt und aufdeckt, empfängt der Video renderer-Filter eine WM_PAINT Meldung. Standardmäßig fordert der Video renderer einen neuen Frame an, und der Graphfilter-Manager hält das Diagramm an, um einen anderen Videoframe anzuzeigen. Wenn dies geschieht, während das Diagramm eine Datei schreibt, wird die Datei beschädigt. Das Überschreiben des Standardverhaltens EC_REPAINT verhindert, dass der Renderer einen neuen Frame anfordert.
Sie müssen diesen Schritt nicht ausführen, wenn Sie die ICaptureGraphBuilder2-Schnittstelle verwenden, da der Capture Graph Builder dies automatisch für Sie erledigt. Außerdem ist dies nicht erforderlich, wenn Sie den Video Mixing Renderer (VMR) für die Vorschau verwenden. Die VMR verfügt immer über den neuesten verfügbaren Frame, sodass keine EC_REPAINT Ereignisse gesendet werden.
Zugehörige Themen