Sekvenční časy prezentace
Toto téma popisuje, jak zdroj Sequencer zpracovává časy prezentace během přehrávání.
Přehled
Zdroj sekvenceru podporuje dva různé režimy: sekvence seznamu stop a sekvence úprav.
V posloupnosti úprav aplikace před zahájením přehrávání určuje dobu trvání jednotlivých segmentů předem. V sekvenci seznamu stop aplikace neurčí dobu trvání předem. (Ve skutečnosti nemusí být doba trvání známá.)
V obou případech můžete určit čas spuštění média segmentu a čas zastavení médií. Tyto časy určují pozici ve zdrojovém souboru, kde segment začíná a končí. Předpokládejme například, že zdrojový soubor má délku 90 sekund. Pokud byste chtěli oříznout prvních 10 sekund a posledních 10 sekund, zadali byste následující hodnoty:
- Spuštění média: 10 sekund
- Zastavení média: 80 sekund
Pokud chcete určit čas spuštění média, nastavte na zdrojovém uzlu atribut MF_TOPONODE_MEDIASTART. Pokud chcete určit čas zastavení média, nastavte na zdrojovém uzlu atribut MF_TOPONODE_MEDIASTOP.
Pokud chcete vytvořit posloupnost úprav, nastavte při vytváření relace médií atribut MF_SESSION_GLOBAL_TIME. V opačném případě relace médií očekává sekvence seznamů stop. V posloupnosti úprav musí mít každá topologie segmentu atribut MF_TOPOLOGY_PROJECTSTART a atribut MF_TOPOLOGY_PROJECTSTOP.
Sekvence seznamů stop
V sekvenci seznamu stop začíná hodiny prezentace na nule a pokračuje přes hranice segmentů. Nativní zdroje poskytují ukázky s časovými razítky, které se rovnají času média. Kanál převede časová razítka na správný čas prezentace následujícím způsobem:
- Nové časové razítko = čas média + posun − začátek média
Hodnota posunu je prezentační čas, kdy předchozí segment skončil. U prvního segmentu je posun nulový. Tady jsou dva příklady výpočtu těchto převodů časových razítek:
- Příklad 1: Předpokládejme, že první segment (S1) je dlouhý 10 sekund a druhý segment (S2) má čas spuštění média nula. Nativní zdroj používá pro časová razítka média, takže první ukázka z S2 má časové razítko nuly. Posun je 10 sekund (doba trvání S1), takže upravené časové razítko je:0 + 10 − 0 = 10 sekund.
- Příklad 2: Předpokládejme, že segment S1 je dlouhý 10 sekund a S2 má čas spuštění média 5 sekund. První ukázka z S2 má časové razítko 5 sekund (čas média). Posun je 10 sekund, takže upravené časové razítko je:5 + 10 − 5 = 10 sekund.
Všechny komponenty kanálu, které jsou podřízené ze zdrojových uzlů, přijímají vzorky s upravenými časovými razítky. Zdrojové uzly v topologii můžou mít různé časy spuštění médií, takže úpravy se vypočítají zvlášť pro každou větev topologie.
Když se prezentace přepne do dalšího segmentu, hodiny prezentace se nezastaví nebo resetují a čas prezentace se monotonicky zvýší. Před spuštěním nového segmentu odešle relace médií aplikaci MESessionNotifyPresentationTime událostí. Událost určuje počáteční čas segmentu vzhledem k hodině prezentace a hodnotu posunu. Když se spustí nový segment, kanál volá Spustit ve zdroji sequenceru s hodnotou VT_EMPTY. Zdroj sequenceru odešle událost MESourceStarted bez času spuštění.
Aplikace určuje identifikátor segmentu a časový posun v rámci segmentu. Po hledání začínají hodiny prezentace na segmentu posunu. Tady je příklad fungování tohoto procesu:
- Příklad 3: Aplikace se snaží segmentovat S3 s posunem segmentu 10 sekund. Hodiny prezentace začínají 10 sekund (posun segmentu). Posun nezahrnuje dobu trvání segmentů S1 a S2. Zdroj sequenceru odešle MESourceStarted událost s počátečním časem, který se rovná posunu segmentu, 10 sekund.
Pokud přehrávání pokračuje v dalším segmentu, bude přechod fungovat stejně jako v předchozích příkladech s tím rozdílem, že posun neobsahuje přeskočené segmenty.
Tady je několik dalších podrobností, které ovlivňují způsob, jakým jsou vzorky časové razítko:
- Dekodéry můžou potřebovat data nad rámec doby zastavení média. Kanál načítá tolik dat ze zdroje, kolik vyžaduje dekodér, a pak oříznou výstupní vzorky dekodéru.
- Transformace můžou ukládat data do vyrovnávací paměti. Může to být například potřeba udělat zvukový efekt. Když segment skončí, časové razítko poslední ukázky z transformace je dřívější než konec segmentu, protože transformace drží některá data. Při spuštění dalšího segmentu je časové razítko prvního vzorku o něco dřívější než začátek segmentu. V časových razítkech není žádná mezera, takže data, která dosáhnou jímky médií, jsou souvislá. Po skončení konečného segmentu kanál vyprázdní transformaci, takže se neztratí žádná data.
- Zdroj možná bude muset začít o něco dříve, než je čas spuštění média, aby se vybral předchozí snímek klíče. Proto po úpravě může mít první vzorek negativní dobu prezentace.
Úpravy sekvencí
V posloupnosti úprav aplikace předem určuje hranice segmentů nastavením MF_TOPOLOGY_PROJECTSTART a MF_TOPOLOGY_PROJECTSTOP atributů. Kanál vypočítá úpravy časových razítek téměř stejným způsobem jako pořadí seznamů stop:
Pro posun používá hodnotu MF_TOPOLOGY_PROJECTSTARTmísto použití pozorovaného konce segmentu.
Pro hledání používá posun hodnotu, která se rovná hodnotě MF_TOPOLOGY_PROJECTSTART segmentu a posun segmentu.
Proto je čas prezentace v sekvenci úprav vždy relativní vzhledem ke začátku prezentace, i když aplikace hledá jiný segment.
Související témata
-
zdroje sequenceru