Définition du type de média de groupe

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

[Cette API n’est pas prise en charge et peut être modifiée ou indisponible à l’avenir.]

Tous les groupes doivent définir un type de média non compressé, audio ou vidéo. Le type de média non compressé est le format que les visionneuses voient ou entendent pendant la lecture. En règle générale, la sortie finale est dans un format compressé. Pour plus d’informations, consultez Rendu d’un projet.

Pour définir le format non compressé, créez une structure AM_MEDIA_TYPE et remplissez-la avec le type principal, le sous-type et l’en-tête de format appropriés. Pour la vidéo, allouez une structure VIDEOINFOHEADER pour le bloc de format et définissez la largeur, la hauteur et la profondeur de bits. Pour l’audio, allouez une structure WAVEFORMATEX pour le bloc de format et définissez la fréquence d’échantillonnage, la profondeur de bits et le nombre de canaux. Si vous définissez uniquement le type principal, DES fournit des valeurs par défaut raisonnables pour les autres valeurs. Dans la pratique, vous devez définir les valeurs explicitement pour contrôler la sortie.

Après avoir initialisé la structure de type de média, appelez la méthode IAMTimelineGroup::SetMediaType pour définir le type de média pour le groupe.

L’exemple suivant spécifie la vidéo RVB 16 bits, de 320 pixels de large par 240 pixels de haut :

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’exemple suivant spécifie un groupe audio, en définissant le type de média de groupe sur stéréo 16 bits, 44100 échantillons par seconde :

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);

Vous pouvez également utiliser la classe CMediaType dans les classes de base DirectShow pour gérer les types de médias. Il contient des méthodes d’assistance utiles et libère automatiquement le bloc de format.

À propos des types de média

Construction d’une chronologie