Partager via


Transmettre à partir d’un fichier type-1

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngineet audio/vidéo capture dans 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 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 indiqué dans le diagramme suivant.

transmission type 1 avec d’aperçu

Les filtres de ce graphique sont les suivants :

  • Le splitter AVI analyse le fichier AVI. Pour un fichier DV de type 1, la broche de sortie fournit des exemples DV entrelacés.
  • Le filtre De broche infinie fractionne le DV entrelacé en 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 de broche infinie au lieu de l'Smart Tee, car il n’y a aucun danger de supprimer des images lors de la lecture à partir d’un fichier, car il y a une capture dynamique.)
  • Le séparateur DV fractionne le flux entrelacé en flux vidéo DV, qui est décodé par le décodage DV Video Decoderet un flux audio. Les deux flux sont rendererd pour la préversion.

Générez 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 graphique de filtre.
  2. Créez le splitter AVI et le tee de broche infinie, puis ajoutez-les au graphe.
  3. Appelez ICaptureGraphBuilder2 ::RenderStream pour connecter le filtre source au splitter AVI. Spécification de MEDIATYPE_Interleaved pour vous assurer que la méthode échoue si le fichier source n’est pas un fichier DV de type 1. Dans ce cas, vous pouvez revenir en arrière et tenter de créer un graphique de transmission de type 2 à la place.
  4. Appelez RenderStream à nouveau pour acheminer le flux entrelacé du splitter AVI vers le tee de broche infinie
  5. Appelez RenderStream une troisième fois pour router un flux de l’Infini Pin Tee vers le filtre MSDV, pour la transmission à 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