Zeitformate für Suchbefehle

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

Viele der Methoden in der IMediaSeeking-Schnittstelle verfügen über Parameter, die Positionswerte ausdrücken, z. B. aktuelle Position oder Stoppposition. Standardmäßig werden diese Parameter in Einheiten von 100 Nanosekunden ausgedrückt, die auch als Referenzzeit bezeichnet werden. Jeder Filter, der gesucht werden 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 die Suche nach einem bestimmten Byteoffset in einem Stream. Jede dieser Zeiteinheiten wird als Zeitformat bezeichnet und durch einen global eindeutigen Bezeichner (GUID) definiert. Eine Liste der Zeitformate, die von DirectShow definiert werden, finden Sie unter Zeitformat-GUIDs. Drittanbieter können auch GUIDs für benutzerdefinierte Zeitformate definieren.

Rufen Sie die IMediaSeeking::IsFormatSupported-Methode auf, um zu ermitteln, ob die Filter, die derzeit im Filterdiagramm enthalten sind, ein bestimmtes Zeitformat unterstützen. 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, wird der Frame 20 verwendet:

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 Graphwiedergabe oder andere Aktionen aus.