Aufnahme von DV in unkomprimierte RGB-Daten
In diesem Beispiel wird gezeigt, wie Sie DV aus dem -Rgb erfassen und während der Vorschau als unkomprimierte RGB-Datei in einer Datei speichern. Verwenden Sie das im folgenden Diagramm gezeigte Filterdiagramm.

Der FILTER DV-Splitter teilt die überlappenden Audio-/Videodatenströme in separate Video- und Audiostreams auf. Das DV-codierte Video wird an den FILTER DV-Videodecoder übertragen, der unkomprimierte RGB-Videos ausgibt. Das RGB-Video wird über den Smart Tee-Filter an den AVI Mux-Filter (für die Erfassung) und den Videorenderer (für die Vorschau) weitergeleitet. In der Zwischenzeit durchläuft der Audiostream vom DV-Splitter den Filter Infinite Pin Tee an den AVI Mux und den Audiorenderer. Der Filter-Graph-Manager hält alle diese Datenströme mithilfe der Zeitstempel in den Stichproben und der Graphverweisuhr synchronisiert.
Dieses Diagramm mag unnötig kompliziert erscheinen, stellt jedoch sicher, dass der DV-codierte Videodatenstrom nur einmal decodiert wird, wodurch die CPU-Anforderungen minimiert werden. Beachten Sie außerdem, dass das Video den Smart Tee-Filter durchläuft, während das Audio den Filter Infinite Pin Tee durchläuft. Smart Tee kann Vorschauframes löschen, um die Erfassungsleistung zu verbessern. Dies ist für Videos wünschenswert, aber nicht für Audiodaten, bei denen gelöschte Stichproben stark erkennbar sind. Da die Audiodaten eine viel geringere Bandbreite als das Video erfordern, ist die Wahrscheinlichkeit relativ gering, dass Audiodaten in der Datei verwerfen werden.
Sie müssen dieses Diagramm abschnittsweise erstellen, aber die RenderStream-Methode kann weiterhin hilfreich sein. Verwenden Sie den folgenden Code:
// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("C:\\Example3.avi"), &pMux, 0);
// MSDV to DV splitter.
IBaseFilter *pDVSplit; // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);
// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
pSmartTee);
// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);
// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);
// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);
// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
Sie müssen die Filter DV Splitter, DV Video Decoder, Smart Tee und Infinite Pin Tee erstellen und diese jeweils dem Filterdiagramm hinzufügen. (Aus Gründen der Kürze werden diese Schritte aus dem vorherigen Code weggelassen.) In diesem Beispiel wird die ICaptureGraphBuilder2::FindPin-Methode verwendet, um die Erfassungs- und Vorschaupins im Smart Tee-Filter zu suchen. Capture ist immer Ausgabepin 0, und vorschau ist Ausgabepin 1.