Sdílet prostřednictvím


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:

Proto je čas prezentace v sekvenci úprav vždy relativní vzhledem ke začátku prezentace, i když aplikace hledá jiný segment.

media session

zdroje sequenceru