Übertragen von Typ-1-Datei
[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]
Um eine Datei vom Typ 1 während der Vorschau der Datei zu übertragen, verwenden Sie das im folgenden Diagramm dargestellte Filterdiagramm.
Filter in diesem Diagramm umfassen:
- Der AVI Splitter analysiert die AVI-Datei. Bei einer Typ-1 DV-Datei liefert der Ausgabestift überlappende DV-Proben.
- Der Infinite Pin Tee Filter teilt die interleavierte DV in einen Übertragungsdatenstrom und einen Vorschaudatenstrom auf. Beide Datenströme enthalten dieselben interleavierten Daten. (In diesem Diagramm wird der Infinite Pin Tee anstelle des Smart Teeverwendet, da keine Gefahr besteht, Frames beim Lesen aus einer Datei zu löschen, da es bei der Liveaufnahme vorhanden ist.)
- Der DV Splitter teilt den interleavierten Datenstrom in einen DV-Videostream, der durch den DV Video Decoderdecodiert wird, und einen Audiodatenstrom. Beide Datenströme werden für die Vorschau gerendert.
Erstellen Sie dieses Diagramm wie folgt:
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);
- Rufen Sie IGraphBuilder::AddSourceFilter auf, um dem Filterdiagramm den Quellfilter hinzuzufügen.
- Erstellen Sie den AVI Splitter und den Infinite Pin Tee, und fügen Sie sie dem Diagramm hinzu.
- Rufen Sie ICaptureGraphBuilder2::RenderStream auf, um den Quellfilter mit dem AVI Splitter zu verbinden. Angeben von MEDIATYPE_Interleaved, um sicherzustellen, dass die Methode fehlschlägt, wenn die Quelldatei keine Typ-1 DV-Datei ist. In diesem Fall können Sie stattdessen versuchen, ein Übertragungsdiagramm vom Typ 2 zu erstellen.
- Rufen Sie RenderStream erneut auf, um den interleavierten Datenstrom vom AVI Splitter an den Infinite Pin Tee weiterzuleiten.
- Rufen Sie RenderStream ein drittes Mal auf, um einen Datenstrom vom Infinite Pin Tee an den MSDV-Filter weiterzuleiten, um an das Gerät zu übertragen.
- Rufen Sie RenderStream- ein letztes Mal auf, um den Vorschauabschnitt des Diagramms zu erstellen.
Wenn Sie keine Vorschau wünschen, verbinden Sie einfach die Dateiquelle mit dem MSDV-Filter:
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);
Verwandte Themen