Freigeben über


Steuern eines Erfassungsdiagramms

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

Die IMediaControl-Schnittstelle des Filter Graph-Managers verfügt über Methoden zum Ausführen, Beenden und Anhalten des gesamten Graphen. Wenn das Filterdiagramm jedoch Aufzeichnungs- und Vorschaudatenströme enthält, möchten Sie die beiden Streams wahrscheinlich unabhängig steuern. Sie können z. B. eine Vorschau des Videos anzeigen, ohne es aufzunehmen. Dazu können Sie die ICaptureGraphBuilder2::ControlStream-Methode verwenden.

Hinweis

Diese Methode funktioniert nicht, wenn sie in einer ASF-Datei (Advanced Systems Format) erfasst wird.

 

Steuern des Erfassungsdatenstroms

Der folgende Code legt fest, dass der Videoaufnahmedatenstrom vier Sekunden lang ausgeführt wird, wobei eine Sekunde nach der Ausführung des Diagramms beginnt:

// Control the video capture stream. 
REFERENCE_TIME rtStart = 10000000, rtStop = 50000000;
const WORD wStartCookie = 1, wStopCookie = 2;  // Arbitrary values.
hr = pBuild->ControlStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Video,      // Media type.
    pCap,                 // Capture filter.
    &rtStart, &rtStop,     // Start and stop times.
    wStartCookie, wStopCookie  // Values for the start and stop events.
);
pControl->Run();

Der erste Parameter gibt den zu steuernden Stream als PIN-Kategorie-GUID an. Der zweite Parameter gibt den Medientyp an. Der dritte Parameter ist ein Zeiger auf den Erfassungsfilter. Um alle Aufzeichnungsdatenströme im Diagramm zu steuern, legen Sie den zweiten und dritten Parameter auf NULL fest.

Die nächsten beiden Parameter definieren die Zeiten, zu denen der Stream gestartet und beendet wird, relativ zum Zeitpunkt, zu dem das Diagramm ausgeführt wird. Rufen Sie IMediaControl::Run auf, um das Diagramm auszuführen. Bis Sie das Diagramm ausführen, hat die ControlStream-Methode keine Auswirkung. Wenn das Diagramm bereits ausgeführt wird, werden die Einstellungen sofort wirksam.

Die letzten beiden Parameter werden zum Abrufen von Ereignisbenachrichtigungen verwendet, wenn der Stream gestartet und beendet wird. Für jeden Stream, den Sie mit dieser Methode steuern, sendet das Filterdiagramm ein Ereignispaar: EC_STREAM_CONTROL_STARTED beim Start des Datenstroms und EC_STREAM_CONTROL_STOPPED , wenn der Stream beendet wird. Die Werte von wStartCookie und wStopCookie werden als zweiter Ereignisparameter verwendet. Daher entspricht "lParam2 " im Startereignis "wStartCookie", und "lParam2 " im Stop-Ereignis gleich "wStopCookie". Der folgende Code zeigt, wie Sie diese Ereignisse abrufen:

while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch (evCode)
    {
    case EC_STREAM_CONTROL_STARTED: 
    // param2 == wStartCookie
    break;

    case EC_STREAM_CONTROL_STOPPED: 
    // param2 == wStopCookie
    break;
    
    } 
    pEvent->FreeEventParams(evCode, param1, param2);
}

Die ControlStream-Methode definiert einige spezielle Werte für die Start- und Stoppzeiten.

Wert Start Beenden
MAXLONGLONG Starten Sie diesen Stream niemals. Halten Sie nicht an, bis das Diagramm beendet wird.
NULL Starten Sie sofort, wenn das Diagramm ausgeführt wird. Beenden Sie sofort.

 

Beispielsweise beendet der folgende Code den Aufzeichnungsdatenstrom sofort:

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
    0, 0,     // Start and stop times.
    wStartCookie, wStopCookie); 

Obwohl Sie den Erfassungsdatenstrom beenden und später neu starten können, entsteht eine Lücke in den Zeitstempeln. Bei der Wiedergabe scheint das Video während der Lücke (abhängig vom Dateiformat) zu stocken.

Steuern des Vorschaustreams

Um den Vorschaupin zu steuern, rufen Sie ControlStream auf, aber legen Sie den ersten Parameter auf PIN_CATEGORY_PREVIEW fest. Dies funktioniert genau wie bei PIN_CATEGORY_CAPTURE, mit dem Unterschied, dass Sie keine Referenzzeiten verwenden können, um den Start und das Beenden anzugeben, da die Vorschauframes keine Zeitstempel aufweisen. Daher müssen Sie NULL oder MAXLONGLONG verwenden. Verwenden Sie NULL , um den Vorschaustream zu starten:

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    NULL,    // Start now.
    0,       // (Don't care.)
    wStartCookie, wStopCookie); 

Verwenden Sie MAXLONGLONG, um den Vorschaustream zu beenden:

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    0,               // (Don't care.)
    MAXLONGLONG,     // Stop now.
    wStartCookie, wStopCookie); 

Es spielt keine Rolle, ob der Vorschaudatenstrom von einem Vorschaupin auf dem Erfassungsfilter oder vom Smart Tee-Filter stammt. Die ControlStream-Methode funktioniert in beiden Richtungen.

Bei Videoportpins schlägt die Methode jedoch fehl. In diesem Fall besteht ein anderer Ansatz darin, das Videofenster auszublenden. Fragen Sie das Diagramm für IVideoWindow ab, und verwenden Sie die IVideoWindow::p ut_Visible-Methode , um das Fenster ein- oder auszublenden.

// Hide the video window.
IVideoWindow *pVidWin = 0;
hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVidWin);
if (SUCCEEDED(hr))
{
    pVidWin->put_Visible(OAFALSE);
    pVidWin->Release();
}

Wenn Sie außerdem IVideoWindow::p ut_AutoShow mit dem Wert OAFALSE aufrufen, bevor Sie das Diagramm ausführen, blendet der Video-Renderer-Filter das Fenster aus, bis Sie etwas anderes angeben. Standardmäßig zeigt der Videorenderer das Fenster an, wenn Sie das Diagramm ausführen.

Hinweise zur Streamsteuerung

Das Standardverhalten für einen Pin besteht darin, Beispiele zu liefern, wenn das Diagramm ausgeführt wird. Angenommen, Sie rufen ControlStream mit PIN_CATEGORY_CAPTURE, aber nicht mit PIN_CATEGORY_PREVIEW auf. Wenn Sie das Diagramm ausführen, wird der Vorschaudatenstrom sofort ausgeführt, während der Erfassungsstream zu dem zeitpunkt ausgeführt wird, den Sie in ControlStream angegeben haben.

Wenn Sie mehr als einen Stream erfassen und an einen Mux-Filter senden , z. B. wenn Sie Audio- und Videodaten in einer AVI-Datei erfassen, sollten Sie beide Datenströme im Tandem steuern. Andernfalls blockiert der Mux-Filter möglicherweise das Warten auf einen Stream, da er versucht, die beiden Streams zu verzahnen. Legen Sie die gleichen Start- und Stoppzeiten für alle Aufzeichnungsdatenströme fest, bevor Sie das Diagramm ausführen:

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, 
    
NULL, NULL,       // All capture streams.
    &rtStart, rtStop, 
    wStartCookie, wStopCookie); 

Intern verwendet die ControlStream-Methode die IAMStreamControl-Schnittstelle , die auf den Pins des Erfassungsfilters, des Smart Tee-Filters (falls vorhanden) und möglicherweise des mux-Filters verfügbar gemacht wird. Sie können diese Schnittstelle direkt verwenden, anstatt ControlStream aufzurufen, obwohl dies keinen besonderen Vorteil hat.

Videoaufnahme