Freigeben über


Zeitformate für Suchbefehle

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

Viele der Methoden in der IMediaSeeking Schnittstelle weisen Parameter auf, die Positionswerte ausdrücken, z. B. aktuelle Position oder Stoppposition. Standardmäßig werden diese Parameter in Einheiten von 100 Nanosekunden ausgedrückt, auch als Referenzzeit bezeichnet. Jeder Filter, der suchen kann, muss die Suche nach Referenzzeit unterstützen. Einige Filter können auch andere Zeiteinheiten verwenden, z. B. die Suche nach einer bestimmten Framenummer oder nach einem bestimmten Byte-Offset innerhalb eines Datenstroms. Jede dieser Zeiteinheiten wird als Zeitformat bezeichnet und wird durch einen global eindeutigen Bezeichner (GUID) definiert. Eine Liste der von DirectShow definierten Zeitformate finden Sie unter Zeitformat-GUIDs. Drittanbieter können auch GUIDs für benutzerdefinierte Zeitformate definieren.

Rufen Sie zum Ermitteln, ob die derzeit im Filterdiagramm befindlichen Filter ein bestimmtes Zeitformat unterstützen, die IMediaSeeking::IsFormatSupported-Methode auf. Die Methode gibt S_OK zurück, wenn das Format unterstützt wird. Andernfalls wird S_FALSE oder ein Fehlercode zurückgegeben. Wenn ein Format unterstützt wird, können Sie zu diesem Format wechseln, indem Sie die IMediaSeeking::SetTimeFormat--Methode aufrufen. Wenn die SetTimeFormat- Methode erfolgreich ist, werden nachfolgende Suchbefehle mithilfe des neuen Zeitformats ausgedrückt.

Im folgenden Beispiel wird überprüft, ob das Diagramm die Suche nach Framenummer unterstützt. Wenn ja, sucht sie nach der Framenummer 20:

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // Seek to frame number 20.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

Beachten Sie, dass Zeitformate nur für Suchbefehle gelten. Sie wirken sich nicht auf die Diagrammwiedergabe oder andere Aktionen aus.