Condividi tramite


Funzionalità video

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine 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, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il metodo IAMStreamConfig::GetStreamCaps presenta funzionalità video in una matrice di coppie di strutture AM_MEDIA_TYPE e VIDEO_STREAM_CONFIG_CAPS . È possibile usarlo per esporre tutti i formati e le risoluzioni supportati in un pin, come illustrato di seguito.

Per esempi relativi all'audio di GetStreamCaps, vedi Funzionalità audio.

Si supponga che la scheda di acquisizione supporti il formato JPEG a tutte le risoluzioni comprese tra 160 x 120 pixel e 320 x 240 pixel, inclusi. La differenza tra le risoluzioni supportate è in questo caso perché si aggiunge o sottrae un pixel da ogni risoluzione supportata per ottenere la risoluzione supportata successiva. Questa differenza nelle risoluzioni supportate è detta granularità.

Si supponga che la scheda supporti anche le dimensioni 640 x 480. Di seguito viene illustrata questa singola risoluzione e l'intervallo di risoluzioni precedente (tutte le dimensioni sono comprese tra 160 x 120 pixel e 320 x 240 pixel).

risoluzione da 160 x 120 a 320 x 240 pixel, più 640 x 480

Si supponga inoltre di supportare il formato RGB a 24 bit a risoluzioni comprese tra 160 x 120 e 320 x 240, ma con una granularità pari a 8. La figura seguente mostra alcune delle dimensioni valide in questo caso.

risoluzione da 160 x 120 a 320 a 240, con granularità = 8

Per metterlo in un altro modo e elencare più risoluzioni, le seguenti sono tutte tra l'elenco delle risoluzioni valide.

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ... risoluzioni aggiuntive ...
  • 312 x 232
  • 320 x 240

Usare GetStreamCaps per esporre queste funzionalità di formato colore e dimensione offrendo un tipo di supporto di 320 x 240 JPEG (se la dimensione predefinita o preferita) abbinata a funzionalità minime di 160 x 120, capacità massime di 320 x 240 e granularità pari a 1. La coppia successiva esposta usando GetStreamCaps è un tipo di supporto di 640 x 480 JPEG accoppiato con un minimo di 640 x 480 e un massimo di 640 x 480 e una granularità pari a 0. La terza coppia include un tipo di supporto di 320 x 240, RGB a 24 bit con funzionalità minime di 160 x 120, capacità massime di 320 x 240 e granularità pari a 8. In questo modo è possibile pubblicare quasi ogni formato e funzionalità che la scheda potrebbe supportare. Un'applicazione che deve conoscere i formati di compressione forniti può ottenere tutte le coppie e creare un elenco di tutti i sottotipi univoci dei tipi di supporti.

Un filtro ottiene i rettangoli di origine e destinazione del tipo di supporto dai membri rcSource e rcTarget della struttura VIDEOINFOHEADER. I filtri non devono supportare i rettangoli di origine e di destinazione.

Il rettangolo di ritaglio descritto nella documentazione di IAMStreamConfig corrisponde al rettangolo rcSource della struttura VIDEOINFOHEADER per il pin di output.

Il rettangolo di output descritto in tutta la documentazione di IAMStreamConfig corrisponde ai membri biWidth e biHeight della struttura BITMAPINFOHEADER del pin di output (vedere Dati DV nel formato di file AVI).

Se il pin di output di un filtro è connesso a un tipo di supporto con rettangoli di origine e di destinazione non interrotti, è necessario il filtro per estendere il subrectangle di origine del formato di input nel subrectangle di destinazione del formato di output. Il subrectangle di origine viene archiviato nel membro InputSize della struttura VIDEO_STREAM_CONFIG_CAPS.

Si consideri ad esempio lo scenario di compressore video seguente: l'immagine di input è in formato RGB e ha una dimensione di 160 x 120 pixel. L'angolo superiore sinistro del rettangolo di origine è in corrispondenza della coordinata (20,20) e l'angolo inferiore destro si trova in corrispondenza di (30,30). L'immagine di output è in formato MPEG con dimensioni pari a 320 x 240. L'angolo superiore sinistro del rettangolo di destinazione si trova in corrispondenza di (0,0) e l'angolo inferiore destro si trova in corrispondenza di (100,100). In questo caso, il filtro deve accettare un pezzo da 10 x 10 della bitmap di origine RGB 160 x 120 e far sì che riempia l'area superiore 100 x 100 di una bitmap 320 x 240, lasciando il resto della bitmap 320 x 240 non toccata. La figura seguente illustra questo scenario.

estensione subrectangle

Un filtro potrebbe non supportare questa operazione e potrebbe non riuscire a connettersi con un tipo di supporto in cui rcSource e rcTarget non sono vuoti.

La struttura VIDEOINFOHEADER espone informazioni sulle funzionalità di velocità dei dati di un filtro. Si supponga, ad esempio, di aver connesso il pin di output al filtro successivo con un determinato tipo di supporto (direttamente o usando il tipo di supporto passato dalla funzione CMediaType::SetFormat ). Esaminare il membro dwBitRate della struttura di formato VIDEOINFOHEADER del tipo di supporto per visualizzare la frequenza dei dati in cui comprimere il video. Se si moltiplica il numero di unità di tempo per fotogramma nel membro AvgTimePerFrame della struttura VIDEOINFOHEADER in base alla frequenza dei dati nel membro dwBitRate e si divide per 10.000.000 (il numero di unità al secondo), è possibile determinare il numero di byte che ogni fotogramma deve essere. È possibile produrre un telaio di dimensioni più piccole, ma mai più grande. Per determinare la frequenza dei fotogrammi per un compressore video o per un filtro di acquisizione, usare AvgTimePerFrame dal tipo di supporto del pin di output.