Uso dei controlli di visualizzazione video

[Il componente descritto in questa pagina, Il renderer video avanzato è una funzionalità legacy. È stato sostituito dal Simple Video Renderer (SVR) esposto attraverso i componenti MediaPlayer e IMFMediaEngine . Per riprodurre contenuti video, è necessario inviare dati a uno di questi componenti e consentire loro di creare un'istanza del nuovo renderer video. Questi componenti sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer o le API IMFMediaEngine di livello inferiore per riprodurre contenuti multimediali video in Windows anziché EVR, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

L'interfaccia IMFVideoDisplayControl controlla il modo in cui il renderer video avanzato (EVR) visualizza il video all'interno di una finestra dell'applicazione. Questa interfaccia può essere usata in DirectShow o Media Foundation. Internamente, i controlli di visualizzazione video vengono forniti dal relatore predefinito di EVR. Se si scrive un relatore personalizzato, è possibile fornire la stessa interfaccia o definire un'interfaccia personalizzata.

Il modo corretto per ottenere un puntatore all'interfaccia IMFVideoDisplayControl dipende dal fatto che si usi la versione DirectShow di EVR o Media Foundation. Per Media Foundation EVR, dipende anche dal fatto che si stia usando direttamente il EVR o usandolo tramite la sessione multimediale (che è più tipico).

Per ottenere un puntatore all'interfaccia IMFVideoDisplayControl , eseguire le operazioni seguenti:

  1. Ottenere un puntatore all'interfaccia IMFGetService .

    • Se si usa il filtro DirectShow EVR, chiamare QueryInterface sul filtro.

    • Se si usa direttamente il sink multimediale EVR, chiamare QueryInterface nel sink multimediale.

    • Se si usa la sessione multimediale, chiamare QueryInterface nella sessione multimediale.

  2. Se si usa la sessione multimediale, attendere che la sessione multimediale invii l'evento MESessionTopologyStatus con un valore di stato di MF_TOPOSTATUS_READY. Ignorare questo passaggio in caso contrario.

  3. Chiama IMFGetService::GetService per ottenere l'interfaccia IMFVideoDisplayControl. L'identificatore del servizio è MR_VIDEO_RENDER_edizione Standard RVICE.

È possibile usare l'interfaccia IMFVideoDisplayControl per eseguire le attività seguenti:

  • Impostare la finestra di ritaglio.

  • Impostare i rettangoli di origine e di destinazione.

  • Aggiornare la finestra video in risposta ai messaggi della finestra.

  • Abilitare o disabilitare la modalità schermo intero.

Finestra di ritaglio

L'applicazione deve fornire una finestra in cui EVR disegna il video. Per impostare la finestra di ritaglio, chiama IMFVideoDisplayControl::SetVideoWindow con un handle per la finestra dell'applicazione.

Se si crea il sink multimediale EVR tramite il relativo oggetto di attivazione, questo passaggio non è obbligatorio. L'oggetto di attivazione chiama automaticamente SetVideoWindow, usando l'handle di finestra fornito nella funzione MFCreateVideoRendererActivate.

Rettangoli di origine e di destinazione

Durante la riproduzione, il relatore acquisisce una parte dell'immagine video composita e la disegna in un'area della finestra video. La parte dell'immagine composita è il rettangolo di origine e l'area della finestra video è il rettangolo di destinazione.

Il rettangolo di origine viene definito usando coordinate normalizzate in cui il punto (0,0, 0,0) corrisponde all'angolo superiore sinistro del video e (1,0, 1,0) corrisponde all'angolo inferiore destro del video. Il rettangolo di origine può essere qualsiasi area all'interno di questo rettangolo. Il rettangolo di destinazione viene specificato in pixel, rispetto all'area client della finestra. Il rettangolo di origine predefinito è l'intera immagine e il rettangolo di destinazione predefinito è un rettangolo vuoto.

Per impostare i rettangoli di origine e di destinazione, chiama IMFVideoDisplayControl::SetVideoPosition.

Se si crea il sink multimediale EVR tramite il relativo oggetto di attivazione, questo passaggio non è obbligatorio. L'oggetto attivazione imposta automaticamente il rettangolo di destinazione uguale all'intera area client della finestra. Tuttavia, è necessario chiamare SetVideoPosition se si desidera modificare il rettangolo di origine o impostare un rettangolo di destinazione diverso.

Messaggi finestra

Durante la riproduzione, l'applicazione deve rispondere a determinati messaggi di finestra, come indicato di seguito:

  • WM_PAINT: chiama IMFVideoDisplayControl::RepaintVideo per riprodurre il video. Inoltre, evitare di disegnare sul rettangolo di destinazione durante la riproduzione del video, perché ciò può causare sfarfallio.

  • WM_SIZE: potrebbe essere necessario chiamare SetVideoPosition per ridimensionare il rettangolo di destinazione.

A differenza del filtro VmR (Video Mixing Renderer) in DirectShow, non è necessario inviare una notifica all'EVR quando si riceve un messaggio di WM_DISPLAYCHANGE.

Renderer video avanzato