À propos des types de médias (DirectShow)

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est 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.]

Étant donné que DirectShow est modulaire, il nécessite un moyen de décrire le format des données à chaque point du graphe de filtre. Par exemple, envisagez la lecture AVI. Les données entrent dans le graphique sous la forme d’un flux de segments RIFF. Ceux-ci sont analysés dans des flux vidéo et audio. Le flux vidéo se compose d’images vidéo, qui sont probablement compressées. Après le décodage, le flux vidéo est une série de bitmaps non compressées. Le flux audio passe par un processus similaire.

Types de médias : comment DirectShow représente les formats

Le type de média est un moyen universel et extensible de décrire les formats multimédias numériques. Lorsque deux filtres se connectent, ils s’accordent sur un type de média. Le type de média identifie le type de données que le filtre amont fournira au filtre en aval et la disposition physique des données. Si deux filtres ne peuvent pas s’entendre sur un type de média, ils ne se connectent pas.

Pour certaines applications, vous n’aurez jamais à vous soucier des types de médias. Dans la lecture de fichiers, par exemple, DirectShow gère tous les détails. D’autres types d’applications peuvent avoir besoin de fonctionner directement avec des types de médias.

Les types de médias sont définis à l’aide de la structure AM_MEDIA_TYPE . Cette structure contient les informations suivantes :

  • Type principal : le type principal est un GUID qui définit la catégorie globale des données. Les principaux types incluent la vidéo, l’audio, le flux d’octets non traité, les données MIDI, etc.

  • Sous-type : le sous-type est un autre GUID, qui définit davantage le format. Par exemple, dans le type principal de vidéo, il existe des sous-types pour RVB-24, RVB-32, UYVY, etc. Dans l’audio, il y a l’audio PCM, la charge utile MPEG-1 et d’autres. Le sous-type fournit plus d’informations que le type principal, mais il ne définit pas tout sur le format. Par exemple, les sous-types vidéo ne définissent pas la taille de l’image ou la fréquence d’images. Elles sont définies par le bloc de format, décrit ci-dessous.

  • Bloc de format : le bloc de format est un bloc de données qui décrit le format en détail. Le bloc de format est alloué séparément de la structure AM_MEDIA_TYPE . Le membre pbFormat de la structure AM_MEDIA_TYPE pointe vers le bloc de format.

    Le membre pbFormat est typé void* car la disposition du bloc de format change en fonction du type de média. Par exemple, l’audio PCM utilise une structure WAVEFORMATEX . La vidéo utilise différentes structures, notamment VIDEOINFOHEADER et VIDEOINFOHEADER2. Le membre formattype de la structure AM_MEDIA_TYPE est un GUID qui spécifie la structure contenue dans le bloc de format. Un GUID est attribué à chaque structure de format. Le membre cbFormat spécifie la taille du bloc de format. Toujours case activée ces valeurs avant de déréférencement du pointeur pbFormat.

Si le bloc de format est renseigné, le type principal et le sous-type contiennent des informations redondantes. Toutefois, le type et le sous-type principaux fournissent un moyen pratique d’identifier les formats sans bloc de format complet. Par exemple, vous pouvez spécifier un format RVB 24 bits générique (MEDIASUBTYPE_RGB24), sans connaître toutes les informations requises par la structure VIDEOINFOHEADER , telles que la taille de l’image et la fréquence d’images.

Par exemple, un filtre peut utiliser le code suivant pour case activée un type de média :

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

La structure AM_MEDIA_TYPE contient également des champs facultatifs. Ils peuvent être utilisés pour fournir des informations supplémentaires, mais les filtres ne sont pas nécessaires pour les utiliser :

  • lSampleSize. Si ce champ n’est pas égal à zéro, il définit la taille de chaque exemple. S’il est égal à zéro, cela indique que la taille de l’exemple peut passer de l’échantillon à l’exemple.
  • bFixedSizeSamples. Si cet indicateur booléen a la valeur TRUE, cela signifie que la valeur dans lSampleSize est valide. Sinon, vous devez ignorer lSampleSize.
  • bTemporalCompression. Si cet indicateur booléen a la valeur FALSE, cela signifie que toutes les images sont des images clés.

Le graphe de filtre et ses composants