Udostępnij przez


Ustawianie i pobieranie pozycji

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Wykres filtru utrzymuje dwie wartości pozycji, bieżące położenie i położenie zatrzymania. Są one zdefiniowane w następujący sposób:

  • Gdy wykres działa, bieżąca pozycja odpowiada bieżącej pozycji odtwarzania względem początku źródła. Po zatrzymaniu lub wstrzymaniu wykresu bieżąca pozycja to punkt, w którym rozpocznie się przesyłanie strumieniowe w następnym poleceniu uruchomienia.
  • Położenie zatrzymania to punkt, w którym zakończy się strumień. Gdy wykres osiągnie położenie zatrzymania, żadne dane nie są przesyłane strumieniowo, a menedżer grafów filtrów publikuje zdarzenie EC_COMPLETE. (Wykres nie przełącza się automatycznie do stanu zatrzymanego, jednak. Aby uzyskać więcej informacji, zobacz Odpowiadanie na zdarzenia.)

Aby pobrać te wartości, wywołaj metodę IMediaSeeking::GetPositions. Zwrócone wartości są zawsze względne względem oryginalnego źródła multimediów. Domyślnie wartości są w jednostkach czasu odniesienia. W niektórych przypadkach można zmienić jednostki czasu; aby uzyskać więcej informacji, zobacz Formaty czasu dla poleceń wyszukiwania.

Aby wyszukać nową pozycję lub ustawić nową pozycję zatrzymania, wywołaj metodę IMediaSeeking::SetPositions, jak pokazano w poniższym przykładzie:

#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
    );

Notatka

Jedna sekunda to 10 000 000 jednostek czasu odniesienia. Dla wygody przykład definiuje tę wartość jako ONE_SECOND. Jeśli używasz biblioteki klas bazowych DirectShow, stała UNITS ma tę samą wartość.

 

Parametr rtNow określa nową bieżącą pozycję. Drugi parametr to flaga definiująca sposób interpretowania rtNow. W tym przykładzie flaga AM_SEEKING_AbsolutePositioning wskazuje, że rtNow określa pozycję bezwzględną w źródle. W związku z tym wykres filtru będzie dążyć do położenia dwóch sekund od początku strumienia. Parametr rtStop daje czas zatrzymania. Ostatni parametr określa, że rtStop jest również pozycją bezwzględną.

Aby określić położenie względem poprzedniej wartości pozycji, użyj flagi AM_SEEKING_RelativePositioning. Aby pozostawić jedną z wartości pozycji bez zmian, użyj flagi AM_SEEKING_NoPositioning. W takim przypadku odpowiedni parametr czasu może być null. Poniższy przykład przewija do przodu o 10 sekund, ale nie zmienia pozycji zatrzymania.

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

Jeśli wykres filtru zostanie zatrzymany, renderator wideo nie zaktualizuje obrazu po operacji wyszukiwania. Dla użytkownika będzie on wyświetlany tak, jakby wyszukiwanie nie miało miejsce. Aby zaktualizować obraz, wstrzymaj wykres po operacji wyszukiwania. Wstrzymanie grafu powoduje przygotowanie nowej ramki wideo do modułu renderującego wideo. Możesz użyć metody IMediaControl::StopWhenReady, która wstrzymuje graf, a następnie zatrzymuje go.