Gestione degli eventi repaint in Acquisizione video
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Se si crea un grafico di acquisizione video senza usare l'interfaccia ICaptureGraphBuilder2 e si visualizza l'anteprima del video usando il vecchio filtro Video Renderer, è consigliabile eseguire l'override della gestione predefinita per gli eventi EC_REPAINT . Eseguire query su Filter Graph Manager per l'interfaccia IMediaEvent e chiamare il metodo IMediaEvent::CancelDefaultHandling con il valore EC_REPAINT:
IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
pEvent->CancelDefaultHandling (EC_REPAINT);
pEvent->Release();
}
Ciò impedisce un possibile errore che può danneggiare il file di acquisizione. Se l'utente copre e individua la finestra di anteprima, il filtro Video Renderer riceve un messaggio di WM_PAINT. Per impostazione predefinita, il Renderer video richiede un nuovo frame e Filter Graph Manager sospende il grafico per creare un altro fotogramma video. In caso affermativo durante la scrittura di un file, il file verrà danneggiato. L'override del comportamento predefinito EC_REPAINT impedisce al renderer di richiedere un nuovo frame.
Non è necessario eseguire questo passaggio se si usa l'interfaccia ICaptureGraphBuilder2 , perché Capture Graph Builder lo esegue automaticamente. Inoltre, non è necessario se si usa il renderer di mix video (VMR) per l'anteprima. VmR ha sempre il frame più recente disponibile, quindi non invia eventi EC_REPAINT.
Argomenti correlati