Partager via


Transmettre à partir d’un fichier de type 1

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

Pour transmettre un fichier de type 1 lors de l’aperçu du fichier, utilisez le graphique de filtre illustré dans le diagramme suivant.

transmission de type 1 avec préversion

Les filtres de ce graphique sont les suivants :

  • Le fractionnement AVI analyse le fichier AVI. Pour un fichier DV de type 1, la broche de sortie fournit des exemples DV entrelacés.
  • Le filtre Infinite Pin Tee fractionne la DV entrelacée en un flux de transmission et un flux d’aperçu. Les deux flux contiennent les mêmes données entrelacées. (Ce graphique utilise le tee d’épingle infini au lieu du Tee intelligent, car il n’y a aucun risque de supprimer des images lors de la lecture à partir d’un fichier, comme il existe avec la capture en direct.)
  • Le séparateur DV fractionne le flux entrelacé en un flux vidéo DV, qui est décodé par le décodeur vidéo DV, et un flux audio. Les deux flux sont rendus pour la préversion.

Créez ce graphique comme suit :

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)

// Initialize pDV (not shown). 
// Create and initialize the Capture Graph Builder (not shown).

// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");

// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
    L"C:\\YourFileNameHere.avi",
    L"Source", 
    &pFileSource);

// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");

// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
    // This is not an AVI file. 
}

// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
    // This is not a type-1 DV file.
}

// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);

// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
  1. Appelez IGraphBuilder::AddSourceFilter pour ajouter le filtre source au graphe de filtre.
  2. Créez le fractionnement AVI et le tee d’épingle infinie, puis ajoutez-les au graphique.
  3. Appelez ICaptureGraphBuilder2::RenderStream pour connecter le filtre source au fractionnement AVI. Spécifier MEDIATYPE_Interleaved pour garantir l’échec de la méthode si le fichier source n’est pas un fichier DV de type 1. Dans ce cas, vous pouvez reculer et tenter de créer un graphe de transmission de type 2 à la place.
  4. Appelez à nouveau RenderStream pour acheminer le flux entrelacé du splitter AVI vers le tee de pin infini
  5. Appelez RenderStream une troisième fois pour acheminer un flux de l’objet Infinite Pin Tee vers le filtre MSDV, pour le transmettre à l’appareil.
  6. Appelez RenderStream une dernière fois pour générer la section d’aperçu du graphique.

Si vous ne souhaitez pas d’aperçu, connectez simplement la source de fichier au filtre MSDV :

hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);

Vidéo numérique dans DirectShow