Erfassen von DV zu unkomprimiertem RGB

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

In diesem Beispiel wird gezeigt, wie Sie DV vom Camcorder aufnehmen und während der Vorschau in einer Datei als unkomprimierte RGB-Datei speichern. Verwenden Sie das Filterdiagramm, das im folgenden Diagramm dargestellt ist.

Unkomprimierte RGB-Datei erfassen

Der DV-Splitter-Filter unterteilt die verschachtelten Audio-/Videodaten in separate Video- und Audiostreams Das DV-codierte Video wird an den DV-Video-Decoder-Filter gesendet, der unkomprimiertes RGB-Video ausgibt. Das RGB-Video wird über den Smart Tee-Filter an den AVI Mux-Filter (für die Aufnahme) und den Videorenderer (für die Vorschau) weitergeleitet. In der Zwischenzeit geht der Audiostream aus dem DV Splitter über den Infinite Pin Tee-Filter an den AVI Mux und den Audiorenderer. Der Filter Graph-Manager hält alle diese Datenströme synchronisiert, wobei die Zeitstempel für die Beispiele und die Diagrammreferenzuhr verwendet werden.

Dieses Diagramm mag unnötig kompliziert erscheinen, stellt aber sicher, dass der DV-codierte Videostream 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. Der Smart Tee kann Vorschauframes löschen, um die Aufnahmeleistung zu verbessern, was für Video, aber nicht für Audio wünschenswert ist, wo gelöschte Samples sehr auffällig sind. Da das Audio auch eine viel geringere Bandbreite als das Video benötigt, besteht relativ wenig Chance, Audio in der Datei zu löschen.

Sie müssen dieses Diagramm einen Abschnitt nach dem anderen erstellen, aber die RenderStream-Methode kann immer noch helfen. 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 jeweils dem Filterdiagramm hinzufügen. (Aus Gründen der Kürze werden diese Schritte im vorherigen Code weggelassen.) In diesem Beispiel wird die ICaptureGraphBuilder2::FindPin-Methode verwendet, um die Aufnahme- und Vorschaupins im Smart Tee-Filter zu finden. Capture ist immer Ausgabepin 0, und Vorschau ist Ausgabepin 1.

Digitales Video in DirectShow