Sdílet prostřednictvím


Hodiny prezentace

hodiny prezentace je objekt, který generuje hodiny prezentace. Čas hlášený hodinou prezentace se nazývá čas prezentace. Všechny streamy v prezentaci se synchronizují s časem prezentace. Hodiny prezentace zpřístupňují následující rozhraní.

Rozhraní Popis
MMFPresentationClock Primární rozhraní pro použití hodin prezentace.
MMFRateControl Řídí rychlost hodin.
MMFTimer Poskytuje zpětné volání časovače.
MMFShutdown Vypne hodiny prezentace.

 

Jímky médií používají čas prezentace k naplánování, kdy se mají vykreslovat ukázky. Pokaždé, když jímka médií obdrží novou ukázku, získá časové razítko ze vzorku a vykreslí v daném čase vzorky nebo co nejblíže k této době. Vzhledem k tomu, že všechny jímky médií v topologii sdílejí stejné hodiny prezentace, synchronizují se několik datových proudů (například zvuku a videa). Zdroje médií a transformace nepoužívají hodiny prezentace, protože neplánují, kdy mají předvést ukázky. Místo toho vytvoří ukázky pokaždé, když kanál požádá o novou ukázku.

Pokud k přehrávání používáte relaci multimédií, relace médií zpracovává všechny podrobnosti o vytváření hodin prezentace, výběr zdroje času a upozorňování jímek médií. Aplikace může použít hodiny prezentace k získání aktuálního času prezentace během přehrávání, ale jinak nebude volat žádné metody hodin prezentace.

Stavy hodin a hodin

Pokud chcete získat nejnovější čas z hodin prezentace, zavolejte MMFPresentationClock::GetTime. Časy hodin jsou vždy v 100 nanosekundových jednotkách, takže jedna sekunda je 10 000 000 (10^7) klíště. To odpovídá frekvenci 10 MHz.

Hodiny prezentace mají tři stavy: Spuštěno, pozastaveno a zastaveno.

  • Chcete-li spustit hodiny, zavolejte MMFPresentationClock::Start. Metoda Start určuje počáteční čas hodin. V době, kdy jsou hodiny spuštěné, se doba hodin zvýší od počátečního času v aktuální hodinové frekvenci.
  • Chcete-li pozastavit hodiny, zavolejte MMFPresentationClock::P ause. Zatímco jsou hodiny pozastavené, hodiny nepřesunou a GetTime vrátí čas, kdy byly hodiny pozastaveny.
  • Chcete-li zastavit hodiny, zavolejte MMFPresentationClock::Stop. Když jsou hodiny zastaveny, hodiny nepřesunou a GetTime vrátí nulu.

Ve výchozím nastavení se hodiny posunují rychlostí 1,0, což znamená 1 tick za 100 nanosekund. Chcete-li změnit rychlost, s jakou hodiny postoupí, zadejte dotaz na hodiny prezentace pro MMFRateControl rozhraní a zavolejte MMFRateControl::SetRate.

Objekty můžou přijímat oznámení o změnách stavu (včetně změn rychlosti) z hodin prezentace. Pokud chcete dostávat oznámení, implementujte ROZHRANÍ MMFClockStateSink a volejte MMFPresentationClock::AddClockStateSink na hodiny prezentace. Před vypnutím volejte MMFPresentationClock::RemoveClockStateSink zrušit registraci objektu. Jímky médií používají tento mechanismus k přijímání oznámení z hodin.

Časy prezentace

Jímka médií se pokusí naplánovat každou ukázku tak, aby se vzorek vykresloval ve správný čas nebo co nejblíže správnému času. Platí následující definice:

  • Prezentační čas Čas, kdy se má vykreslí ukázka. Čas je uveden v jednotkách 100 nanosekund.
  • Čas média. Čas vzhledem k začátku obsahu Pokud je například videosoubor dlouhý 10 sekund, má bod půl cesty k souboru mediální čas 5 sekund.
  • Časové razítko. Čas označený v ukázce médií. Chcete-li získat časové razítko, zavolejte MMFSample::GetSampleTime. Když zdroj médií vytvoří vzorek, nastaví časové razítko stejné jako čas média. Relace médií přeloží časové razítko do času prezentace.

Ve výchozím nastavení jsou čas multimédií a čas prezentace stejné, například pokud se ve zdrojovém souboru zobrazí 5 sekund rámečku videa, je čas média i čas prezentace 5 sekund. Pokud používáte zdrojovou Sequencer, je model časování poněkud složitější, aby bylo možné hladké přechody mezi segmenty. Další informace o modelu časování zdroje sekvenceru najdete v tématu Časy prezentace sekvence.

Zdroj médií vždy nastaví časové razítko stejné jako čas média. Pokud čas prezentace není v souladu s časem média, relace médií převede časová razítka u ukázek médií. Do okamžiku, kdy jímka obdrží ukázku, se časové razítko ukázky převedlo na čas prezentace. Jímka naplánuje ukázku podle aktuálního času hodin prezentace. (Bez rateless jímky jsou výjimkou, protože ignorují hodiny prezentace.)

Pokud se aplikace pokusí o novou pozici, relace médií restartuje hodiny prezentace v zadané době hledání. Pokud například aplikace hledá 5sekundovou pozici v souboru, relace médií spustí hodiny v 5 sekundách. Zdroj médií může doručovat vzorky s mírně dřívějším časovým razítkem, pokud doba hledání nepřepadne na hranici rámce klíče. To je nutné, aby dekodéry mohly dekódovat všechny snímky. Relace médií klesne nebo ořízne vzorky před tím, než se dostanou k jímce médií, aby odpovídala požadované době hledání. Pokud je například doba hledání 5 sekund, může první ukázka zvuku začínat 4,5 sekundy. Relace médií ořízne prvních 0,5 sekund z první dekódované zvukové ukázky.

Vytvoření hodin prezentace

Chcete-li vytvořit hodiny prezentace, zavolejte MFCreatePresentationClock. Chcete-li vypnout hodiny, dotaz na MMFShutdown rozhraní a volání MMFShutdown::Vypnutí. Volající MFCreatePresentationClock zodpovídá za volání Vypnutí; ve většině případů se jedná o relaci médií, nikoli o aplikaci.

Zdroje času prezentace

Navzdory názvu hodiny prezentace ve skutečnosti neimplementují hodiny. Místo toho získá časy hodin z jiného objektu, kterému se říká zdroj času prezentace . Zdrojem času může být libovolný objekt, který generuje přesné hodinové ticháky a zveřejňuje ROZHRANÍ MMFPresentationTimeSource. Následující obrázek znázorňuje tento proces.

diagram znázorňující vztah mezi hodinou prezentace a zdrojem času prezentace

Při prvním vytvoření hodin prezentace nemá zdroj času. Chcete-li nastavit zdroj času, volání MMFPresentationClock::SetTimeSource s ukazatelem na časové zdroje MMFPresentationTimeSource rozhraní. Časový zdroj podporuje stejné stavy jako hodiny prezentace (spuštěné, pozastavené a zastavovací) a musí implementovat ROZHRANÍ MMFClockStateSink. Hodiny prezentace používají toto rozhraní k upozorňovat zdroj času, kdy změnit stav. Tímto způsobem zdroj času poskytuje značky hodin, ale hodiny prezentace iniciují změny stavu ve hodinách.

Některé jímky médií mají přístup k přesným hodinám, a proto zpřístupňují MMFPresentationTimeSource rozhraní. Konkrétně může renderer zvuku používat frekvenci zvukové karty jako hodiny. Při přehrávání zvuku je užitečné, aby renderer zvuku fungoval jako zdroj času, aby se video synchronizovalo s rychlostí přehrávání zvuku. To obvykle vede k lepším výsledkům než pokus o spárování zvuku s externími hodinami.

Media Foundation také poskytuje zdroj času prezentace na základě systémových hodin. Chcete-li vytvořit tento objekt, zavolejte MFCreateSystemTimeSource. Systémový zdroj času lze použít v případě, že žádné jímky médií neposkytují zdroj času.

Obecně platí, že jímka médií musí používat hodiny prezentace, které jsou k dispozici bez ohledu na to, jaký zdroj času hodiny prezentace používá. Toto pravidlo platí i v případě, že jímka médií implementuje MMFPresentationTimeSource. Pokud hodiny prezentace používají jiný zdroj času, musí jímka médií postupovat podle tohoto zdroje času, nikoli vlastní interní hodiny.

Existují dvě situace, kdy jímka médií nebude sledovat hodiny prezentace:

  • Některé jímky médií jsou bez rychlosti . Pokud je jímka médií bezobsáhá, spotřebovává vzorky co nejrychleji, aniž by je naplánovala podle hodin prezentace. Obvykle bez rateless jímky zapisují data do souboru, takže je žádoucí dokončit operaci co nejrychleji. Bezobsáhlá jímka vrátí příznak MEDIASINK_RATELESS v MMFMediaSink::GetCharacteristics metoda. Pokud jsou všechny jímky v topologii bez přenosové rychlosti, relace médií odesílá data kanálem co nejrychleji.

  • Některé jímky médií nemůžou odpovídat sazbám s jiným zdrojem času než se samotnými. Pokud ano, jímka vrátí příznak MEDIASINK_CANNOT_MATCH_CLOCK v jeho GetCharacteristics metoda. Kanál může stále používat jiný zdroj času, ale výsledky budou menší než optimální. Jímka pravděpodobně při přehrávání zapadne a způsobí výpadky.

rozhraní API platformy Media Foundation