Implementowanie kontroli szybkości
W tym temacie opisano, jak niestandardowe obiekty potoku mogą obsługiwać zmienne współczynniki odtwarzania, w tym odtwarzanie odwrotne. Aby uzyskać informacje o korzystaniu z kontroli szybkości z aplikacji, zobacz Rate Control.
Ten temat zawiera następujące sekcje:
Jeśli piszesz obiekt potoku programu Microsoft Media Foundation (źródło multimediów, transformacja lub ujście multimediów), może być konieczne obsługę zmiennych współczynników odtwarzania. W tym celu zaimplementuj następujące interfejsy:
- Zaimplementuj interfejs IMFGetService.
- Wspieraj usługę MF_RATE_CONTROL_SERVICE. (Zobacz interfejsy serwisowe .)
- Zaimplementuj interfejs IMFRateSupport, który pobiera współczynniki odtwarzania obsługiwane przez obiekt.
- Zaimplementuj interfejsIMFRateControl, który pobiera lub ustawia częstotliwość odtwarzania.
Źródła multimediów
Jeśli źródło multimediów obsługuje kontrolę szybkości, należy zaimplementować zarówno IMFRateSupport, jak i IMFRateControl. W przeciwnym razie sesja multimedialna zgłasza, że minimalna i maksymalna szybkość odtwarzania wynosi 1,0, niezależnie od tego, jakie inne komponenty znajdują się w strumieniu.
Częstotliwość odtwarzania nie ma wpływu na czas prezentacji próbek, więc źródło multimediów nie powinno dostosowywać swoich sygnatur czasowych. Zamiast tego zegar prezentacji działa z szybciej lub wolniejszą prędkością. W przypadku odtwarzania odwrotnego źródło dostarcza próbki w odwrotnej kolejności, przy zmniejszeniu sygnatur czasowych.
Parametr fThinIMFRateControl::SetRate metoda wskazuje, czy źródło multimediów powinno cienką zawartości. Rozrzedzenie ma zastosowanie głównie do strumieni wideo. W trybie odchudzonym źródło odrzuca ramki różnicowe i dostarcza tylko klatki kluczowe. Przy bardzo wysokich szybkościach odtwarzania źródło może pomijać niektóre klatki kluczowe (na przykład dostarczać co drugą klatkę kluczową).
Źródło nie musi usuwać próbek audio w trybie redukcji. Jednak przy bardzo wysokich szybkościach odtwarzania źródło może nie być w stanie odczytywać danych wystarczająco szybko, aby wypełnić przykładowe żądania potoku. W takim przypadku źródło może wymagać pominięcia niektórych danych dźwiękowych. Jeśli tak, powinna ona podjąć próbę dostarczenia przykładów dźwiękowych, które są zbliżone do próbek wideo (przy założeniu, że źródło ma oba typy strumienia).
Gdy strumień przechodzi między trybem cienkim i niecieńszczanym, wysyła zdarzenie MEStreamThinMode.
Gdy źródło multimediów zakończy wywołanie SetRate, wysyła zdarzenie MESourceRateChanged.
Podczas odtwarzania odwrotnego:
- Źródło multimediów dostarcza próbki w odwrotnej kolejności, bez dostosowywania sygnatur czasowych.
- Sygnatury czasowe w strumieniu powinny monotonicznie się zmniejszać.
- Początek zawartości jest uważany za koniec strumienia. Gdy każdy strumień medialny dostarcza pierwszą próbkę w strumieniu (czyli czas prezentacji = 0), wysyła zdarzenie MEEndOfStream.
Przekształcenia programu Media Foundation
Ogólnie rzecz biorąc, transformacja Media Foundation (MFT) nie wymaga jawnej obsługi kontroli tempa, chyba że MFT implementuje odtwarzanie wsteczne bez redukcji jakości.
Jeśli MFT nie implementuje interfejsu IMFRateSupport, sesja multimediów zakłada następujące założenia:
- MFT obsługuje dowolne współczynniki odtwarzania na potrzeby odtwarzania do przodu, zarówno rozrzedzonych, jak i nierozrzedzonych.
- MFT obsługuje odtwarzanie odwrotne w wersji uproszczonej, ale nie obsługuje odtwarzania odwrotnego w wersji pełnej.
Jeśli którykolwiek z tych warunków nie jest spełniony, MFT powinien zaimplementować IMFRateSupport i IMFRateControl.
Odtwarzanie odwrotne
Sesja multimediów może być odtwarzana odwrotnie, nawet jeśli co najmniej jedna transformacja w potoku nie wyraźnie obsługuje odtwarzania odwrotnego.
Jeśli MFT nie ujawnia interfejsu IMFRateSupport, sesja multimedialna używa rozrzedzenia do odtwarzania odwrotnego w następujący sposób:
Sesja medialna wysyła kluczowe ramki do MFT w zwykły sposób, wywołując IMFTransform::ProcessInput.
Sesja multimediów usuwa ramki różnicowe i zastępuje je zdarzeniami MEStreamTick.
Między poszczególnymi próbkami Sesja multimediów opróżnia MFT, aby uniknąć błędów spowodowanych tym, że znaczniki czasu maleją.
Próbka jest uznawana za ramkę klucza, jeśli ma atrybut MFSampleExtension_CleanPoint ustawiony na TRUEi uznaje się ją za ramkę różnicową, jeśli ten atrybut jest FALSE lub nie jest ustawiony.
Jeśli MFT implementuje IMFRateSupport, sesja multimediów używa tego interfejsu do wykrywania, czy MFT obsługuje odtwarzanie odwrotne bez cieniowania. Jeśli MFT obsługuje odtwarzanie odwrotne bez redukcji próbek, sesja multimedialna dostarcza wszystkie próbki w odwrotnej kolejności bez pomijania próbek lub opróżniania MFT.
Jeśli MFT obsługuje nieprzerzedzone odtwarzanie odwrotne, powinien zaimplementować interfejs IMFRateControl. Sesja multimedialna będzie używać tego interfejsu, aby powiadomić MFT o odtwarzaniu wstecznym. W tym momencie MFT musi być gotowy na to, że sygnatury czasowe będą maleć, a ramki różnicowe przyjdą w odwrotnej kolejności. Dekoder zwykle musi buforować próbki, dopóki nie otrzyma całej grupy obrazów (GOP), a następnie zdekoduje całe goP i wyprowadza zdekodowane ramki w prawidłowej kolejności (odwrotnej).
Odbiorniki multimedialne
Jeśli ujście multimediów jest rateless, sesja multimediów zakłada, że ujście multimediów może obsługiwać dowolną szybkość odtwarzania. Odbiornik multimedialny nie musi implementować IMFRateSupport. (Ujście multimediów bez prędkości zwraca flagę MEDIASINK_RATELESS z metody IMFMediaSink::GetCharacteristics).
W przeciwnym razie odbiornik multimediów powinien implementować IMFRateSupport, jeśli może obsługiwać współczynniki odtwarzania inne niż 1.0.
Odbiorniki multimediów nie powinny implementować IMFRateControl. Gdy szybkość odtwarzania się zmienia, zegar prezentacji wywołuje metodę IMFClockStateSink::OnClockSetRate.
Tematy pokrewne