Uso dei controlli Mixer 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.

Il mixer EVR fornisce diverse interfacce che un'applicazione può usare per controllare il modo in cui il mixer elabora il video. Queste interfacce possono essere usate in DirectShow o Media Foundation.

Interfaccia Descrizione
Interfaccia IMFVideoMixerBitmap Alfa fonde un'immagine bitmap statica nel video.
Interfaccia IMFVideoMixerControl Controlla il modo in cui EVR combina i sottostream video.
Interfaccia IMFVideoProcessor Controlla la regolazione del colore, i filtri immagine e altre funzionalità di elaborazione video. Questa interfaccia fornisce l'accesso alle funzionalità implementate dal driver grafico, quindi le funzionalità esatte dipenderanno dal driver di grafica dell'utente.

 

Il modo corretto per ottenere puntatori a queste interfacce 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. In genere un'applicazione userà EVR tramite la sessione multimediale, non direttamente.

Per ottenere un puntatore a una di queste interfacce, eseguire le operazioni seguenti:

  1. Ottenere un puntatore all'interfaccia IMFGetService in EVR.

    • 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 se non si usa la sessione multimediale.

  3. Chiamare IMFGetService::GetService per ottenere l'interfaccia mixer. Usare l'identificatore del servizio MR_VIDEO_MIXER_edizione Standard RVICE.

Alpha Blending a Bitmap on the Video (Fusione alfa di una bitmap nel video)

Puoi usare l'interfaccia IMFVideoMixerBitmap per combinare alfa una bitmap statica nel video durante la riproduzione. È possibile archiviare la bitmap in una superficie Direct3D, specificata come puntatore IDirect3DSurface9 o usare una bitmap GDI.

Se si usa una superficie Direct3D per la bitmap, la superficie può contenere dati alfa per pixel, che verranno usati quando il mixer unisce l'immagine. In alternativa, è possibile definire una chiave di colore, ovvero un singolo colore che sarà trasparente ovunque venga visualizzato nella bitmap. Inoltre, è possibile specificare un valore alfa che verrà applicato all'intera immagine. È anche possibile impostare un rettangolo di origine per ritagliare la bitmap e un rettangolo di destinazione per posizionare la bitmap all'interno del fotogramma video.

Per impostare la bitmap, chiama IMFVideoMixerBitmap::SetAlphaBitmap. Questo metodo accetta un puntatore a una struttura MFVideoAlphaBitmap che specifica la bitmap e i parametri di fusione alfa. Per un esempio di codice, vedere l'argomento di riferimento per il metodo SetAlphaBitmap .

Dopo aver impostato la bitmap, è possibile aggiornare i parametri di fusione, inclusi i rettangoli di origine e di destinazione, chiamando IMFVideoMixerBitmap::UpdateAlphaBitmapParameters. L'aggiornamento ha effetto sul fotogramma video successivo. Il video deve essere riprodotto affinché venga eseguito l'aggiornamento. È possibile usare questo metodo per eseguire semplici animazioni nella bitmap. Se hai bisogno di effetti più sofisticati, prendi in considerazione la scrittura di un mixer EVR personalizzato.

Per cancellare la bitmap, chiama IMFVideoMixerBitmap::ClearAlphaBitmap.

Controllo dei sottostream

L'EVR può combinare uno o più sottostream video nel flusso video primario. Per controllare la combinazione di flussi secondari, utilizzare l'interfaccia IMFVideoMixerControl .

Impostazioni processore video

Il mixer EVR usa DirectX Video Acceleration (DXVA) per eseguire l'elaborazione video sui flussi di input. Le funzionalità di elaborazione esatte dipendono dal driver grafico. Le funzionalità di elaborazione video vengono descritte usando la struttura DXVA2_VideoProcessorCaps. Un particolare set di funzionalità è denominato modalità di elaborazione video, ogni modalità identificata da un GUID. Per un elenco dei GUID predefiniti, vedere IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Il driver potrebbe definire GUID aggiuntivi specifici del fornitore, che rappresentano diverse combinazioni di funzionalità.

Per trovare le modalità supportate e le funzionalità di ogni modalità, eseguire le operazioni seguenti:

  1. Chiama IMFGetService::GetService per ottenere un puntatore all'interfaccia IMFVideoProcessor del mixer.

  2. Chiamare IMFVideoProcessor::GetAvailableVideoProcessorModes. Questo metodo restituisce una matrice di GUID, che identificano le modalità del processore video disponibili. L'elenco viene restituito in ordine decrescente di qualità, la modalità con la qualità più alta visualizzata per prima nell'elenco. L'elenco può cambiare a seconda del formato del video.

  3. Per ogni GUID nell'elenco, chiama IMFVideoProcessor::GetVideoProcessorCaps per trovare le funzionalità della modalità processore video corrispondente. Il metodo riempie una struttura DXVA2_VideoProcessorCaps con una descrizione delle funzionalità.

  4. Per selezionare una modalità, chiama IMFVideoProcessor::SetVideoProcessorMode. In caso contrario, EVR seleziona automaticamente una modalità all'avvio dello streaming. In tal caso, puoi chiamare IMFVideoProcessor::GetVideoProcessorMode per trovare la modalità selezionata.

La maggior parte dei campi nella struttura DXVA2_VideoProcessorCaps descrive il comportamento del driver di basso livello e non è di interesse per un'applicazione tipica. È molto probabile che i campi seguenti siano di interesse:

  • DeviceCaps. Questo campo indica se l'elaborazione video viene eseguita nell'hardware o nel software e se il driver grafico è un driver DXVA 1.0 precedente.

  • DeinterlaceTechnology. Questo campo fornisce un'indicazione del livello di qualità deinterlacing che si può aspettare se il video di origine è interlacciato.

  • ProcAmpControlCaps. Questo campo specifica quali controlli di regolazione del colore sono disponibili. Per un elenco delle possibili regolazioni dei colori, vedere ProcAmp Impostazioni. Se il driver non può eseguire la regolazione del colore, questo campo è zero.

  • VideoProcessorOperations. Questo campo contiene flag che descrivono varie funzionalità di elaborazione video. Due flag di particolare importanza sono il flag DXVA2_VideoProcess_SubFlussi e il flag DXVA2_VideoProcess_SubFlussi. Almeno uno di questi flag deve essere presente affinché EVR mixi i sottostream nel flusso video di riferimento. Se nessuno dei due flag è presente, L'EVR è limitato a un flusso video.

  • NoiseFilterTechnology. Questo campo indica quali filtri di rumore sono supportati dal driver grafico. Se il driver non supporta il filtro del rumore, il valore è DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Questo campo indica quali filtri di dettaglio sono supportati dal driver di grafica. Se il driver non supporta il filtro del rumore, il valore è DXVA2_DetailFilterTech_Unsupported.

Regolazione dei colori e filtro delle immagini

Il driver grafico potrebbe supportare la regolazione dei colori (detta anche amplificazione del processo o semplicemente ProcAmp) e il filtro delle immagini. Quando viene eseguita dalla GPU, la regolazione del colore e il filtro delle immagini possono essere eseguiti in tempo reale senza sovraccarico della CPU.

Per usare queste funzionalità, seguire questa procedura:

  1. Selezionare una modalità di elaborazione video come descritto nella sezione precedente.

  2. Chiama IMFVideoProcessor::GetVideoProcessorCaps per trovare le funzionalità di elaborazione video come descritto nella sezione precedente. Il metodo compila una struttura DXVA2_VideoProcessorCaps che descrive le funzionalità, incluso se il driver supporta la regolazione del colore e il filtro immagine.

  3. Per ogni regolazione del colore supportata dal driver, chiama IMFVideoProcessor::GetProcAmpRange per trovare l'intervallo di valori possibile per tale impostazione. Questo metodo restituisce anche il valore predefinito per l'impostazione. Chiama IMFVideoProcessor::GetProcAmpValues per trovare il valore corrente delle impostazioni. I valori non hanno unità specificate. Spetta al driver definire l'intervallo di valori.

  4. Chiama IMFVideoProcessor::SetFilteringValue per impostare un valore di regolazione del colore.

  5. Se il driver supporta il filtro delle immagini, ogni tipo di filtro (rumore e dettaglio) supporta tre impostazioni, ovvero livello, raggio e soglia, sia in cromatica che in luma. (Vedere Impostazioni filtro immagini DXVA. Per ogni impostazione, chiamare IMFVideoProcessor::GetFilteringRange per ottenere l'intervallo di valori possibili e chiamare IMFVideoProcessor::GetFilteringValue per ottenere il valore corrente.

  6. Per modificare un'impostazione del filtro immagine, chiamare IMFVideoProcessor::SetFilteringValue.

Renderer video avanzato