Jak określić obsługiwane stawki
Przed zmianą częstotliwości odtwarzania aplikacja powinna sprawdzić, czy szybkość odtwarzania jest obsługiwana przez obiekty w potoku. Interfejs IMFRateSupport udostępnia metody uzyskania maksymalnych stawek dla kierunków do przodu i wstecz, najwolniejszej stawki oraz obsługiwanej stawki najbliższej do żądanej. Każde z tych zapytań szybkości może określać kierunek odtwarzania i określać, czy należy używać rozrzedzania. Dokładna częstotliwość odtwarzania jest odpytywane przy użyciu interfejsu IMFRateControl.
Aby uzyskać informacje o zmianie częstotliwości odtwarzania, zobacz Jak ustawić częstotliwość odtwarzania w sesji multimediów.
Aby uzyskać ogólne informacje na temat częstotliwości odtwarzania, zobacz About Rate Control.
Pobierz usługę kontroli szybkości transmisji z sesji multimedialnej.
IMFRateControl *pRateControl = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateControl, (void**) &pRateControl );
Przekaż zainicjowany wskaźnik interfejsu IMFMediaSession w parametrze punkObjectMFGetService.
Aplikacja musi wykonywać zapytania dotyczące usługi kontroli szybkości za pośrednictwem sesji multimediów. Wewnętrznie sesja multimediów wysyła zapytanie do obiektów w topologii.
Wywołaj metodę IMFRateControl::GetRate, aby uzyskać bieżącą częstotliwość odtwarzania.
hr = pRateControl->GetRate(&bThin, &rate);
Parametr pfThin w funkcji GetRate otrzymuje wartość BOOL, która wskazuje, czy strumień jest obecnie rozrzedzony. Aplikacja musi przekazać null, jeśli nie chce wykonywać zapytań o obsługę rozrzedzania strumienia. Parametr pflRate odbiera bieżącą szybkość odtwarzania.
Uzyskaj usługę pomocy technicznej rate z sesji multimediów.
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
Przekaż zainicjowany wskaźnik interfejsu IMFMediaSession w parametrze punkObjectMFGetService.
Wywołaj metodę IMFRateSupport::IsRateSupported, aby pobrać obsługiwaną częstotliwość najbliższą żądanej szybkości odtwarzania.
float rateRequested = 4.0; float actualRate = 0; hr = pRateSupport->IsRateSupported( TRUE, rateRequested, &actualRate );
Przykład sprawdza, czy szybkość odtwarzania wynosząca 4,0 jest obsługiwana przy redukcji. Jest to wskazane przez przekazanie true w fThin parametru IsRateSupported. Jeśli ta szybkość jest obsługiwana, actualRate zawiera szybkość odtwarzania 4,0, a wywołanie powiedzie się z wartością zwracaną S_OK. Jeśli dokładna szybkość odtwarzania nie jest obsługiwana, zostaje wybrana najbliższa obsługiwana szybkość w actualRate. Jeśli szybkość nie jest obsługiwana i nie ma dostępnej najbliższej szybkości odtwarzania, wywołanie zwraca odpowiedni kod błędu.
Te wartości mogą ulec zmianie w zależności od tego, które składniki potoku zostały załadowane. W związku z tym należy ponownie wykonać zapytanie o wartości za każdym razem, gdy załadujesz nową topologię.
Jeśli żądana szybkość odtwarzania nie jest obsługiwana, jedną z opcji jest wykonywanie zapytań dotyczących każdego obiektu w topologii indywidualnie, aby dowiedzieć się, czy dany składnik nie obsługuje szybkości. Może być możliwe ponowne skompilowanie topologii bez tego składnika, a następnie odtwarzanie w żądanej szybkości. Jeśli na przykład każdy składnik z wyjątkiem modułu renderowania audio obsługuje daną szybkość, można ponownie skompilować topologię bez gałęzi audio i odtwarzać w żądanej szybkości bez dźwięku.
Skorzystaj z usługi wsparcia dotyczącej stawek z sesji multimedialnej.
IMFRateSupport *pRateSupport = NULL; hr = MFGetService( pMediaSession, MF_RATE_CONTROL_SERVICE, IID_IMFRateSupport, (void**) &pRateSupport );
Przekaż zainicjowany wskaźnik interfejsu IMFMediaSession w parametrze punkObjectMFGetService.
Wywołaj metodę IMFRateSupport::GetSlowestRate, aby pobrać najwolniejszy obsługiwany współczynnik.
float slowestRate = 0; hr = pRateSupport->GetSlowestRate( MFRATE_REVERSE, TRUE, &slowestRate);
Przykładowe zapytania dotyczące najwolniejszego współczynnika odtwarzania odwrotnego z rozrzedzeniem. Dolna granica szybkości jest zawarta w parametrze najwolniejszejSzybkości w GetSlowestRate.
Jeśli odtwarzanie odwrotne lub rozrzedzenie nie jest obsługiwane, wywołanie zwraca odpowiedni kod błędu.