Fonctionnalités vidéo

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

La méthode IAMStreamConfig::GetStreamCaps présente des fonctionnalités vidéo dans un tableau de paires de structures AM_MEDIA_TYPE et VIDEO_STREAM_CONFIG_CAPS . Vous pouvez l’utiliser pour exposer tous les formats et résolutions pris en charge sur une broche, comme indiqué ci-dessous.

Pour obtenir des exemples audio de GetStreamCaps, consultez Fonctionnalités audio.

Supposons que votre carte de capture prenne en charge le format JPEG à toutes les résolutions comprises entre 160 x 120 pixels et 320 x 240 pixels, y compris. La différence entre les résolutions prises en charge est une dans ce cas, car vous ajoutez ou soustrayez un pixel de chaque résolution prise en charge pour obtenir la résolution prise en charge suivante. Cette différence dans les résolutions prises en charge est appelée granularité.

Supposons que votre carte prend également en charge la taille 640 x 480. L’exemple suivant illustre cette résolution unique et la plage de résolutions ci-dessus (toutes tailles comprises entre 160 x 120 pixels et 320 x 240 pixels).

résolution de 160 x 120 à 320 x 240 pixels, plus 640 x 480

Supposons également qu’il prenne en charge le format RVB couleur 24 bits à des résolutions comprises entre 160 x 120 et 320 x 240, mais avec une granularité de 8. L’illustration suivante montre certaines des tailles valides dans ce cas.

résolution de 160 x 120 à 320 à 240, avec granularité = 8

En d’autres points, et en listant d’autres résolutions, les résolutions suivantes font toutes partie de la liste des résolutions valides.

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ... résolutions supplémentaires ...
  • 312 x 232
  • 320 x 240

Utilisez GetStreamCaps pour exposer ces fonctionnalités de format de couleur et de dimension en offrant un type de média de 320 x 240 JPEG (s’il s’agit de votre taille par défaut ou préférée) associé à des fonctionnalités minimales de 160 x 120, des fonctionnalités maximales de 320 x 240 et une granularité de 1. La paire suivante que vous exposez à l’aide de GetStreamCaps est un type de média de 640 x 480 JPEG couplé à un minimum de 640 x 480 et un maximum de 640 x 480 et une granularité de 0. La troisième paire comprend un type de média 320 x 240, RVB 24 bits avec des fonctionnalités minimales de 160 x 120, des fonctionnalités maximales de 320 x 240 et une granularité de 8. De cette façon, vous pouvez publier presque tous les formats et fonctionnalités que vos carte peuvent prendre en charge. Une application qui doit connaître les formats de compression que vous fournissez peut obtenir toutes les paires et créer une liste de tous les sous-types uniques des types de média.

Un filtre obtient ses rectangles source et cible de type de média à partir des membres rcSource et rcTarget de la structure VIDEOINFOHEADER, respectivement. Les filtres n’ont pas besoin de prendre en charge les rectangles source et cible.

Le rectangle de rognage décrit dans la documentation IAMStreamConfig est identique au rectangle rcSource de la structure VIDEOINFOHEADER pour l’épingle de sortie.

Le rectangle de sortie décrit dans la documentation IAMStreamConfig est identique aux membres biWidth et biHeight de la structure BITMAPINFOHEADER de la broche de sortie (voir DV Data in the AVI File Format.).

Si la broche de sortie d’un filtre est connectée à un type de média avec des rectangles source et cible non vides, votre filtre est nécessaire pour étendre la sous-correction source du format d’entrée dans le sous-rectangle cible du format de sortie. Le sous-paramètre source est stocké dans le membre InputSize de la structure VIDEO_STREAM_CONFIG_CAPS.

Par exemple, considérez le scénario de compression vidéo suivant : l’image d’entrée est au format RVB et a une taille de 160 x 120 pixels. Le coin supérieur gauche du rectangle source se trouve à la coordonnée (20,20) et son coin inférieur droit est à (30,30). L’image de sortie est au format MPEG avec une taille de 320 x 240. L’angle supérieur gauche du rectangle cible est à (0,0) et son coin inférieur droit est à (100 100). Dans ce cas, le filtre doit prendre une partie 10 x 10 de l’image bitmap source RVB de 160 x 120, et la faire remplir la zone 100 x 100 supérieure d’une bitmap 320 x 240, laissant le reste de la bitmap 320 x 240 intacte. L’illustration suivante illustre ce scénario.

étirement de sous-correction

Un filtre peut ne pas prendre en charge ce problème et peut ne pas se connecter à un type de média où rcSource et rcTarget ne sont pas vides.

La structure VIDEOINFOHEADER expose des informations sur les fonctionnalités de débit de données d’un filtre. Par exemple, supposons que vous connectiez votre broche de sortie au filtre suivant avec un certain type de média (directement ou à l’aide du type de média transmis par la fonction CMediaType::SetFormat ). Examinez le membre dwBitRate de la structure de format VIDEOINFOHEADER de ce type de média pour voir le débit de données dans lequel vous devez compresser la vidéo. Si vous multipliez le nombre d’unités de temps par image dans le membre AvgTimePerFrame de la structure VIDEOINFOHEADER par le débit de données dans le membre dwBitRate et divisez par 10 000 000 (nombre d’unités par seconde), vous pouvez déterminer le nombre d’octets que chaque image doit être. Vous pouvez produire un cadre de plus petite taille, mais jamais plus grand. Pour déterminer la fréquence d’images d’un compresseur vidéo ou d’un filtre de capture, utilisez AvgTimePerFrame à partir du type de média de votre broche de sortie.