Connecter deux filtres

[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 rubrique présente certaines fonctions d’assistance pour la connexion des filtres DirectShow.

Pour connecter deux filtres, vous devez trouver une broche de sortie non connectée sur le filtre amont et une broche d’entrée non connectée sur le filtre en aval.

Si vous avez déjà des pointeurs vers les deux broches, appelez la méthode IGraphBuilder::Connect pour les connecter. Si les broches ne peuvent pas se connecter directement les unes aux autres, la méthode IGraphBuilder::Connect peut insérer des filtres supplémentaires pour terminer la connexion. Pour plus d’informations, consultez Intelligent Connect.

Si vous avez un pointeur vers les filtres, mais pas les broches, vous devez utiliser la méthode IBaseFilter::EnumPins pour rechercher les épingles. (Voir Énumération des broches.) Les fonctions d’assistance de cette rubrique illustrent cette technique.

Broche de sortie au filtre

La fonction suivante accepte deux paramètres : un pointeur vers une broche de sortie et un pointeur vers un filtre. La fonction connecte la broche de sortie à la première broche d’entrée disponible sur le filtre.

// Connect output pin to filter.

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, // Filter Graph Manager.
    IPin *pOut,            // Output pin on the upstream filter.
    IBaseFilter *pDest)    // Downstream filter.
{
    IPin *pIn = NULL;
        
    // Find an input pin on the downstream filter.
    HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pIn->Release();
    }
    return hr;
}

Cette fonction effectue les opérations suivantes :

  1. Appelle la FindUnconnectedPin fonction pour obtenir une broche d’entrée non connectée. Cette fonction est présentée dans la rubrique Rechercher une épingle non connectée sur un filtre.
  2. Appelle IGraphBuilder::Connect pour connecter les deux broches.

Filtrer sur la broche d’entrée

La fonction suivante prend un pointeur vers un filtre et un pointeur vers une broche d’entrée. Il connecte la broche d’entrée à la première broche de sortie disponible sur le filtre.

// Connect filter to input pin.

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
    IPin *pOut = NULL;
        
    // Find an output pin on the upstream filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        // Try to connect them.
        hr = pGraph->Connect(pOut, pIn);
        pOut->Release();
    }
    return hr;
}

Filtrer sur Filtrer

La troisième fonction prend un pointeur vers un filtre amont et un pointeur vers un filtre en aval, et tente de connecter les deux filtres.

// Connect filter to filter

HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
    IPin *pOut = NULL;

    // Find an output pin on the first filter.
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (SUCCEEDED(hr))
    {
        hr = ConnectFilters(pGraph, pOut, pDest);
        pOut->Release();
    }
    return hr;
}

Techniques de Graph-Building générales

ICaptureGraphBuilder2::RenderStream