Partager via


Configurer le format de sortie 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 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.]

Notes

Les fonctionnalités décrites dans cette rubrique sont déconseillées. Pour configurer le format de sortie d’un appareil de capture, une application doit utiliser la structure AM_MEDIA_TYPE retournée par IAMStreamConfig::GetFormat dans le paramètre pmt .

 

Un appareil de capture peut prendre en charge une gamme de formats de sortie. Par exemple, un appareil peut prendre en charge RVB 16 bits, RVB 32 bits et YUYV. Dans chacun de ces formats, l’appareil peut prendre en charge une plage de tailles d’images.

Dans un appareil WDM, l’interface IAMStreamConfig est utilisée pour indiquer les formats pris en charge par l’appareil et pour définir le format. (Pour les appareils VFW hérités, utilisez la boîte de dialogue Format vidéo VFW, comme décrit dans Afficher les boîtes de dialogue Capture VFW.) L’interface IAMStreamConfig est exposée sur la broche de capture du filtre de capture, la broche d’aperçu ou les deux. Utilisez la méthode ICaptureGraphBuilder2::FindInterface pour obtenir le pointeur d’interface :

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

L’appareil dispose d’une liste de types de médias qu’il prend en charge. Pour chaque type de média, l’appareil fournit également un ensemble de fonctionnalités. Il s’agit notamment de la plage de tailles d’images disponibles pour ce format, de la façon dont l’appareil peut étirer ou réduire l’image et de la plage de fréquences d’images.

Pour obtenir le nombre de types de médias, appelez la méthode IAMStreamConfig::GetNumberOfCapabilities . La méthode retourne deux valeurs :

  • Nombre de types de médias.
  • Taille de la structure qui contient les informations sur les fonctionnalités.

La valeur de taille est nécessaire, car l’interface IAMStreamConfig est utilisée à la fois pour l’audio et la vidéo (et peut être étendue à d’autres types de médias). Pour la vidéo, les fonctionnalités sont décrites à l’aide de la structure VIDEO_STREAM_CONFIG_CAPS , tandis que l’audio utilise la structure AUDIO_STREAM_CONFIG_CAPS .

Pour énumérer les types de médias, appelez la méthode IAMStreamConfig::GetStreamCaps avec un index de base zéro. La méthode GetStreamCaps retourne un type de média et la structure de capacité correspondante :

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

Notez comment les structures sont allouées pour la méthode GetStreamCaps . La méthode alloue la structure de type multimédia, tandis que l’appelant alloue la structure de fonctionnalités. Contraindre la structure des fonctionnalités à un pointeur de tableau d’octets. Une fois que vous avez terminé avec le type de média, supprimez la structure AM_MEDIA_TYPE , ainsi que le bloc de format du type de média.

Vous pouvez configurer l’appareil pour qu’il utilise un format retourné dans la méthode GetStreamCaps . Appelez simplement IAMStreamConfig::SetFormat avec le type de média :

hr = pConfig->SetFormat(pmtConfig);

Si le code pin n’est pas connecté, il tente d’utiliser ce format lorsqu’il ne se connecte pas. Si le code pin est déjà connecté, il tente de se reconnecter à l’aide du nouveau format. Dans les deux cas, il est possible que le filtre en aval rejette le format.

Vous pouvez également modifier le type de média avant de le passer à la méthode SetFormat . C’est là qu’intervient la structure VIDEO_STREAM_CONFIG_CAPS . Il décrit toutes les façons valides de modifier le type de média. Pour utiliser ces informations, vous devez comprendre les détails de ce type de média particulier.

Par exemple, supposons que GetStreamCaps retourne un format RVB 24 bits, avec une taille d’image de 320 x 240 pixels. Vous pouvez obtenir ces informations en examinant le type principal, le sous-type et le bloc de format du type de média :

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 structure VIDEO_STREAM_CONFIG_CAPS donne la largeur et la hauteur minimales et maximales qui peuvent être utilisées pour ce type de média. Il vous donne également la taille « étape », qui définit les incréments par lesquels vous pouvez ajuster la largeur ou la hauteur. Par exemple, l’appareil peut retourner les éléments suivants :

  • MinOutputSize : 160 x 120
  • MaxOutputSize : 320 x 240
  • OutputGranularityX : 8 pixels (taille d’étape horizontale)
  • OutputGranularityY : 8 pixels (taille de pas verticale)

Compte tenu de ces nombres, vous pouvez définir la largeur sur tout ce qui se trouve dans la plage (160, 168, 176, ... 304, 312, 320) et la hauteur à tout ce qui se trouve dans la plage (120, 128, 136, ... 104, 112, 120). Le diagramme suivant illustre ce processus.

tailles de format vidéo

Pour définir une nouvelle taille d’image, modifiez directement la structure AM_MEDIA_TYPE retournée dans GetStreamCaps :

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

Passez ensuite le type de média à la méthode SetFormat , comme décrit précédemment.

Les membres MinFrameInterval et MaxFrameInterval de VIDEO_STREAM_CONFIG_CAPS sont la longueur minimale et maximale de chaque image vidéo, que vous pouvez traduire en fréquences d’images comme suit :

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

Pour demander une fréquence d’images particulière, modifiez la valeur d’AvgTimePerFrame dans la structure VIDEOINFOHEADER ou VIDEOINFOHEADER2 dans le type de média. L’appareil peut ne pas prendre en charge toutes les valeurs possibles entre le minimum et le maximum, de sorte que le pilote utilise la valeur la plus proche qu’il peut. Pour voir la valeur réellement utilisée par le pilote, appelez IAMStreamConfig::GetFormat après avoir appelé SetFormat.

Certains pilotes peuvent signaler MAXLONGLONG (0x7FFFFFFFFFFFFFFF) pour la valeur de MaxFrameInterval, ce qui signifie en effet qu’il n’y a pas de durée maximale. Toutefois, vous pouvez appliquer une fréquence d’images minimale dans votre application, par exemple 1 ips.

À propos des types de médias

Configuration d’un appareil de capture vidéo