Festlegen und Abrufen der Position

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Das Filterdiagramm verwaltet zwei Positionswerte, die aktuelle Position und die Stoppposition. Diese werden wie folgt definiert:

  • Wenn das Diagramm ausgeführt wird, ist die aktuelle Position die aktuelle Wiedergabeposition relativ zum Anfang der Quelle. Wenn das Diagramm angehalten oder angehalten wird, ist die aktuelle Position der Punkt, an dem das Streaming beim nächsten Ausführungsbefehl beginnt.
  • Die Stoppposition ist der Punkt, an dem der Stream endet. Wenn das Diagramm die Stoppposition erreicht, werden keine weiteren Daten gestreamt, und der Filtergraph-Manager sendet ein EC_COMPLETE-Ereignis . (Das Diagramm wechselt jedoch nicht automatisch in den Status "Beendet". Weitere Informationen finden Sie unter Reagieren auf Ereignisse.)

Um diese Werte abzurufen, rufen Sie die IMediaSeeking::GetPositions-Methode auf. Die zurückgegebenen Werte sind immer relativ zur ursprünglichen Medienquelle. Standardmäßig befinden sich die Werte in Bezugszeiteinheiten. In einigen Fällen können Sie die Zeiteinheiten ändern. weitere Informationen finden Sie unter Zeitformate für Suchbefehle.

Um eine neue Position zu suchen oder eine neue Stoppposition festzulegen, rufen Sie die IMediaSeeking::SetPositions-Methode auf, wie im folgenden Beispiel gezeigt:

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

Hinweis

Eine Sekunde beträgt 10.000.000 Einheiten der Referenzzeit. Der Einfachheit halber definiert das Beispiel diesen Wert als ONE_SECOND. Wenn Sie die DirectShow-Basisklassenbibliothek verwenden, hat die Konstante UNITS den gleichen Wert.

 

Der rtNow-Parameter gibt die neue aktuelle Position an. Der zweite Parameter ist ein Flag, das definiert, wie rtNow interpretiert werden soll. In diesem Beispiel gibt das flag AM_SEEKING_AbsolutePositioning an, dass rtNow eine absolute Position in der Quelle angibt. Daher sucht das Filterdiagramm zwei Sekunden vor dem Start des Datenstroms nach einer Position. Der rtStop-Parameter gibt die Stoppzeit an. Der letzte Parameter gibt an, dass rtStop auch eine absolute Position ist.

Um eine Position relativ zum vorherigen Positionswert anzugeben, verwenden Sie das Flag AM_SEEKING_RelativePositioning. Um einen der Positionswerte unverändert zu lassen, verwenden Sie das Flag AM_SEEKING_NoPositioning. Der entsprechende Zeitparameter kann in diesem Fall NULL sein. Im folgenden Beispiel wird um 10 Sekunden nach vorne gesucht, die Stoppposition bleibt jedoch unverändert:

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

Wenn das Filterdiagramm beendet wird, aktualisiert der Videorenderer das Bild nach einem Suchvorgang nicht. Für den Benutzer wird es so aussehen, als ob die Suche nicht stattgefunden hätte. Um das Image zu aktualisieren, halten Sie das Diagramm nach dem Suchvorgang an. Wenn Sie das Diagramm anhalten, wird ein neuer Videoframe für den Videorenderer angezeigt. Sie können die IMediaControl::StopWhenReady-Methode verwenden, die das Diagramm anhält und dann beendet.