Partager via


Génération du graphique de recompression

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

Un graphe de filtre classique pour la recompression de fichiers AVI ressemble à ce qui suit :

Graphe de recompression avi

Le filtre de fractionnement AVI extrait les données du filtre de source de fichier (Async) et les analyse dans des flux vidéo et audio. Le décompresseur vidéo décode la vidéo compressée, où elle est compressée par le compresseur vidéo. Le choix des décompresseurs dépend du fichier source ; il sera géré automatiquement par Intelligent Connect. L’application doit choisir le compresseur, généralement en présentant une liste à l’utilisateur. (Voir Choix d’un filtre de compression.)

La vidéo compressée accède ensuite au filtre AVI Mux. Le flux audio de cet exemple n’étant pas compressé, il passe directement du splitter AVI au Mux AVI. Le Mux AVI entrelace les deux flux, et le filtre enregistreur de fichiers écrit la sortie sur le disque. Notez que le Mux AVI est obligatoire même si le fichier d’origine n’a pas de flux audio.

Le moyen le plus simple de générer ce graphe de filtre consiste à utiliser Capture Graph Builder, qui est un composant DirectShow pour créer des graphiques de capture et d’autres graphiques de filtre personnalisés.

Commencez par appeler CoCreateInstance pour créer capture Graph Builder :

ICaptureGraphBuilder2 *pBuild = NULL;
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, 
                        NULL, CLSCTX_INPROC_SERVER,
    IID_ICaptureGraphBuilder2, (void **)&pBuild);

Ensuite, utilisez Capture Graph Builder pour générer le graphe de filtre :

  1. Générez la section de rendu du graphique, qui inclut le filtre AVI Mux et l’enregistreur de fichiers.
  2. Ajoutez le filtre source et le filtre de compression au graphique.
  3. Connectez le filtre source au filtre MUX. Le générateur de graphiques de capture insère tous les filtres de séparateur et de décodeur nécessaires pour analyser le fichier source. Il peut également acheminer les flux vidéo et audio via des filtres de compression.

Les sections suivantes expliquent chacune de ces étapes.

Générer la section Rendu

Pour générer la section de rendu du graphique, appelez la méthode ICaptureGraphBuilder2::SetOutputFileName . Cette méthode prend des paramètres d’entrée qui spécifient le sous-type multimédia pour la sortie et le nom du fichier de sortie. Il retourne des pointeurs vers le filtre MUX et l’enregistreur de fichiers. Le filtre MUX est nécessaire pour l’étape suivante de la création de graphiques. Le pointeur vers l’enregistreur de fichiers n’est pas nécessaire pour cet exemple, de sorte que ce paramètre peut avoir la valeur NULL :

IBaseFilter *pMux = NULL;
hr = pBuild->SetOutputFileName(
        &MEDIASUBTYPE_Avi, // File type. 
        wszOutputFile,     // File name, as a wide-character string.
        &pMux,             // Receives a pointer to the multiplexer.
        NULL);             // Receives a pointer to the file writer. 

Lorsque la méthode retourne, le filtre MUX a un nombre de références en suspens. Veillez donc à libérer le pointeur ultérieurement.

Le diagramme suivant montre le graphique de filtre à ce stade.

section de rendu du graphe de filtre

Le filtre MUX expose deux interfaces pour le contrôle du format AVI :

Ajouter les filtres source et compression

L’étape suivante consiste à ajouter les filtres source et de compression au graphe de filtre. Capture Graph Builder crée automatiquement une instance du Gestionnaire de graphes de filtre lorsque vous appelez SetOutputFileName. Obtenez un pointeur vers celui-ci en appelant la méthode ICaptureGraphBuilder2::GetFiltergraph :

IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&pGraph);

Appelez maintenant la méthode IGraphBuilder::AddSourceFilter pour ajouter le filtre source de fichier Async, et la méthode IFilterGraph::AddFilter pour ajouter le compresseur vidéo :

IBaseFilter *pSrc = NULL;
hr = pGraph->AddSourceFilter(wszInputFile, L"Source Filter", &pSrc);
hr = pGraph->AddFilter(pVComp, L"Compressor");

À ce stade, le filtre source et le filtre de compression ne sont connectés à rien d’autre dans le graphique, comme illustré dans l’illustration suivante :

filtrer le graphique avec des filtres source et de compression

Connecter la source au Mux

La dernière étape consiste à connecter le filtre source au filtre AVI Mux via le compresseur vidéo. Utilisez la méthode ICaptureGraphBuilder2::RenderStream , qui connecte une broche de sortie sur le filtre source à un filtre récepteur spécifié, éventuellement via un filtre de compression.

Les deux premiers paramètres spécifient les broches du filtre source à connecter, en désignant une catégorie de broche et un type de média. Le filtre source de fichier asynchrone n’a qu’une seule broche de sortie. Ces paramètres doivent donc avoir la valeur NULL. Les trois paramètres suivants spécifient le filtre source, le filtre de compression (le cas échéant) et le filtre Mux.

L’exemple de code suivant restitue le flux vidéo via le compresseur vidéo :

hr = pBuild->RenderStream(
        NULL,       // Output pin category
        NULL,       // Media type
        pSrc,       // Source filter
        pVComp,     // Compression filter
        pMux);      // Sink filter (the AVI Mux)

Le diagramme suivant montre le graphique de filtres jusqu’à présent.

flux vidéo rendu

En supposant que le fichier source a un flux audio, le filtre de fractionnement AVI a créé une broche de sortie pour l’audio. Pour connecter cette broche, appelez à nouveau RenderStream :

hr = pBuild->RenderStream(NULL, NULL, pSrc, NULL, pMux);

Ici, aucun filtre de compression n’est spécifié. La broche de sortie du filtre source est déjà connectée. La méthode RenderStream recherche donc une broche de sortie non connectée sur le filtre de fractionnement. Il recherche la broche audio et la connecte directement au filtre MUX. Si le fichier source n’a pas de flux audio, le deuxième appel à RenderStream échoue. Ce comportement est normal. Le graphique étant terminé après le premier appel à RenderStream, l’échec du deuxième appel est inoffensif.

Dans cet exemple, l’ordre des deux appels RenderStream est important. Étant donné que le deuxième appel ne spécifie pas de compresseur, il connecte toute broche non connectée à partir du séparateur AVI. Si vous effectuez cet appel avant l’autre, il peut connecter le flux vidéo à l’AVI Mux, sans votre compresseur vidéo. Par conséquent, l’appel plus spécifique (avec le filtre de compression) doit se produire en premier.

La discussion précédente a supposé que le fichier source est un fichier AVI. Toutefois, cette technique fonctionne également avec d’autres types de fichiers, tels que les fichiers MPEG. Le graphe de filtre résultant sera quelque peu différent.

Recompression d’un fichier AVI