Condividi tramite


Configurare il formato di output 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.

Nota

La funzionalità descritta in questo argomento è deprecata. Per configurare il formato di output di un dispositivo di acquisizione, un'applicazione deve usare la struttura AM_MEDIA_TYPE restituita da IAMStreamConfig::GetFormat nel parametro pmt .

 

Un dispositivo di acquisizione può supportare un intervallo di formati di output. Ad esempio, un dispositivo potrebbe supportare RGB a 16 bit, RGB a 32 bit e YUYV. All'interno di ognuno di questi formati, il dispositivo può supportare un intervallo di dimensioni dei fotogrammi.

In un dispositivo WDM l'interfaccia IAMStreamConfig viene usata per segnalare i formati supportati dal dispositivo e per impostare il formato. Per i dispositivi VFW legacy, usare la finestra di dialogo Formato video VFW, come descritto nelle finestre di dialogo Visualizza acquisizione VFW. L'interfaccia IAMStreamConfig è esposta nel pin di acquisizione del filtro di acquisizione, nel pin di anteprima o in entrambi i casi. Usare il metodo ICaptureGraphBuilder2::FindInterface per ottenere il puntatore dell'interfaccia:

IAMStreamConfig *pConfig = NULL;
hr = pBuild->FindInterface(
    &PIN_CATEGORY_PREVIEW, // Preview pin.
    0,    // Any media type.
    pCap, // Pointer to the capture filter.
    IID_IAMStreamConfig, (void**)&pConfig);

Il dispositivo include un elenco di tipi multimediali supportati. Per ogni tipo di supporto, il dispositivo fornisce anche un set di funzionalità. Questi includono l'intervallo di dimensioni dei fotogrammi disponibili per tale formato, il modo in cui il dispositivo può estendere o compattare l'immagine e l'intervallo di frequenza dei fotogrammi.

Per ottenere il numero di tipi multimediali, chiamare il metodo IAMStreamConfig::GetNumberOfCapabilities . Il metodo restituisce due valori:

  • Numero di tipi multimediali.
  • Dimensioni della struttura che contiene le informazioni sulle funzionalità.

Il valore delle dimensioni è necessario perché l'interfaccia IAMStreamConfig viene usata sia per audio che per video (e potrebbe essere estesa ad altri tipi di supporti). Per il video, le funzionalità vengono descritte usando la struttura VIDEO_STREAM_CONFIG_CAPS , mentre l'audio usa la struttura AUDIO_STREAM_CONFIG_CAPS .

Per enumerare i tipi di supporti, chiamare il metodo IAMStreamConfig::GetStreamCaps con un indice in base zero. Il metodo GetStreamCaps restituisce un tipo di supporto e la struttura di funzionalità corrispondente:

int iCount = 0, iSize = 0;
hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);

// Check the size to make sure we pass in the correct structure.
if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
{
    // Use the video capabilities structure.

    for (int iFormat = 0; iFormat < iCount; iFormat++)
    {
        VIDEO_STREAM_CONFIG_CAPS scc;
        AM_MEDIA_TYPE *pmtConfig;
        hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc);
        if (SUCCEEDED(hr))
        {
            /* Examine the format, and possibly use it. */

            // Delete the media type when you are done.
            DeleteMediaType(pmtConfig);
        }
}

Si noti come le strutture vengono allocate per il metodo GetStreamCaps . Il metodo alloca la struttura del tipo di supporto, mentre il chiamante alloca la struttura delle funzionalità. Coerce la struttura delle funzionalità in un puntatore di matrice di byte. Dopo aver eseguito il tipo di supporto, eliminare la struttura AM_MEDIA_TYPE , insieme al blocco di formato del tipo di supporto.

È possibile configurare il dispositivo per usare un formato restituito nel metodo GetStreamCaps . Chiamare semplicemente IAMStreamConfig::SetFormat con il tipo di supporto:

hr = pConfig->SetFormat(pmtConfig);

Se il pin non è connesso, tenterà di usare questo formato quando si connette. Se il pin è già connesso, tenta di riconnettersi usando il nuovo formato. In entrambi i casi, è possibile che il filtro downstream rifiuterà il formato.

È anche possibile modificare il tipo di supporto prima di passarlo al metodo SetFormat . Questa è la posizione in cui viene fornita la struttura VIDEO_STREAM_CONFIG_CAPS . Descrive tutti i modi validi per modificare il tipo di supporto. Per usare queste informazioni, è necessario comprendere i dettagli di quel tipo di supporto specifico.

Si supponga, ad esempio, che GetStreamCaps restituisce un formato RGB a 24 bit, con dimensioni del frame pari a 320 x 240 pixel. È possibile ottenere queste informazioni esaminando il tipo principale, il sottotipo e il blocco di formato del tipo di supporto:

if ((pmtConfig.majortype == MEDIATYPE_Video) &&
    (pmtConfig.subtype == MEDIASUBTYPE_RGB24) &&
    (pmtConfig.formattype == FORMAT_VideoInfo) &&
    (pmtConfig.cbFormat >= sizeof (VIDEOINFOHEADER)) &&
    (pmtConfig.pbFormat != NULL))
{
    VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)pmtConfig.pbFormat;
    // pVih contains the detailed format information.
    LONG lWidth = pVih->bmiHeader.biWidth;
    LONG lHeight = pVih->bmiHeader.biHeight;
}

La struttura VIDEO_STREAM_CONFIG_CAPS fornisce la larghezza minima e massima e altezza che può essere usata per questo tipo di supporto. Fornisce anche le dimensioni "passo", che definisce gli incrementi in base al quale è possibile regolare la larghezza o l'altezza. Ad esempio, il dispositivo potrebbe restituire quanto segue:

  • MinOutputSize: 160 x 120
  • MaxOutputSize: 320 x 240
  • OutputGranularityX: 8 pixel (dimensioni del passaggio orizzontale)
  • OutputGranularityY: 8 pixel (dimensioni del passaggio verticale)

Dato questi numeri, è possibile impostare la larghezza su qualsiasi elemento nell'intervallo (160, 168, 176, ... 304, 312, 320) e l'altezza di qualsiasi elemento nell'intervallo (120, 128, 136, ... 104, 112, 120). La figura seguente illustra questo processo.

dimensioni del formato video

Per impostare una nuova dimensione del frame, modificare direttamente la struttura AM_MEDIA_TYPE restituita in GetStreamCaps:

pVih->bmiHeader.biWidth = 160;
pVih->bmiHeader.biHeight = 120;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);

Passare quindi il tipo di supporto al metodo SetFormat , come descritto in precedenza.

I membri MinFrameInterval e MaxFrameInterval di VIDEO_STREAM_CONFIG_CAPS sono la lunghezza minima e massima di ogni fotogramma video, che è possibile tradurre in frequenza di fotogrammi come indicato di seguito:

frames per second = 10,000,000 / frame duration

Per richiedere una frequenza di fotogrammi specifica, modificare il valore di AvgTimePerFrame nella struttura VIDEOINFOHEADER o VIDEOINFOHEADER2 nel tipo di supporto. Il dispositivo potrebbe non supportare ogni valore possibile tra il minimo e il massimo, quindi il driver userà il valore più vicino che può. Per visualizzare il valore effettivamente usato dal driver, chiamare IAMStreamConfig::GetFormat dopo aver chiamato SetFormat.

Alcuni driver possono segnalare MAXLONGLONG (0x7FFFFFFFFFFFFFFF) per il valore di MaxFrameInterval, il che significa che non esiste una durata massima. Tuttavia, potrebbe essere necessario applicare una frequenza minima di fotogrammi nell'applicazione, ad esempio 1 fps.

Informazioni sui tipi di supporti

Configurazione di un dispositivo di acquisizione video