Condividi tramite


Impostazione del tipo di supporto gruppo

[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.

[Questa API non è supportata e può essere modificata o non disponibile in futuro.]

Tutti i gruppi devono definire un tipo di supporto non compresso, audio o video. Il tipo di supporto non compresso è il formato visualizzato o sentito dai visualizzatori durante la riproduzione. In genere, l'output finale sarà in un formato compresso. Per altre informazioni, vedere Rendering di un progetto.

Per impostare il formato non compresso, creare una struttura AM_MEDIA_TYPE e riempirla con il tipo principale, il sottotipo e l'intestazione di formato appropriati. Per il video, allocare una struttura VIDEOINFOHEADER per il blocco di formato e impostare la larghezza, l'altezza e la profondità bit. Per l'audio, allocare una struttura WAVEFORMATEX per il blocco di formato e impostare la frequenza di esempio, la profondità di bit e il numero di canali. Se si imposta solo il tipo principale, DES fornisce valori predefiniti ragionevoli per gli altri valori. In pratica, è necessario impostare i valori in modo esplicito per controllare l'output.

Dopo aver inizializzato la struttura del tipo di supporto, chiamare il metodo IAMTimelineGroup::SetMediaType per impostare il tipo di supporto per il gruppo.

Nell'esempio seguente viene specificato un video RGB a 16 bit, 320 pixel di larghezza di 240 pixel elevati:

AM_MEDIA_TYPE mtGroup;  
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_RGB555;

// Set format headers.
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}

VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 16;
pVideoHeader->bmiHeader.biWidth = 320;
pVideoHeader->bmiHeader.biHeight = 240;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);

// Set the format type and size.
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);

// Set the sample size.
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);

// Now use this media type for the group.
pGroup->SetMediaType(&mtGroup);

// Clean up.
CoTaskMemFree(mtGroup.pbFormat);

L'esempio successivo specifica un gruppo audio impostando il tipo di supporto del gruppo su stereo a 16 bit, 44100 campioni al secondo:

AM_MEDIA_TYPE mt;  
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));

mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;

// Set format block.
mt.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(WAVEFORMATEX));
if (mt.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}
mt.cbFormat = sizeof(WAVEFORMATEX);

// Fill in the WAVEFORMATEX structure.
WAVEFORMATEX *wave = (WAVEFORMATEX*) mt.pbFormat;
wave->wFormatTag = WAVE_FORMAT_PCM;
wave->nChannels = 2;  // Stereo
wave->nSamplesPerSec = 44100;
wave->wBitsPerSample = 16;
wave->nBlockAlign = wave->nChannels * wave->wBitsPerSample/8;
wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nBlockAlign; 
wave->cbSize = 0;

hr = pGroup->SetMediaType(&mt);
CoTaskMemFree(mt.pbFormat);

È anche possibile usare la classe CMediaType nelle classi di base DirectShow per gestire i tipi di supporti. Contiene alcuni metodi helper utili e rilascia automaticamente il blocco di formato.

Informazioni sui tipi di supporti

Creazione di una sequenza temporale