Sdílet prostřednictvím


Časová razítka a doby trvání

Toto téma popisuje, jak Transformace Media Foundation by měly zpracovávat časová razítka.

MFT musí u všech výstupních vzorků nastavit co nejpřesnější časové razítko a dobu trvání. Pro jednoduchý MFT, který přijímá jednu vstupní vyrovnávací paměť a zcela zpracovává do výstupní vyrovnávací paměti, MFT by měl pouze zkopírovat časové razítko a dobu trvání přímo ze vstupní ukázky do výstupního vzorku. Mnoho transformací je ale složitějších a může vyžadovat složitější výpočty výstupního času. Všechny MFT by měly dodržovat následující základní pravidla:

  • MFT by se měl pokusit umístit časové razítko a dobu trvání u všech nekomprimovaných videosouborů nebo zvukových výstupních vzorků, pokud je u vstupních vzorků uvedeno přesné časové razítko nebo doba trvání nebo lze vypočítat. Interpolace může být vyžadována u některých časových razítek výstupu, zejména u dekodérů.
  • Časové razítka a doby trvání vstupních vzorků by měly být zachovány na výstupních vzorcích co nejvíce.
  • Výstupní časová razítka nebo doby trvání nemusí odpovídat vstupu, protože MFT podrží data nebo rozdělí výstup na různé části velikosti než vstup. V takovém případě by MFT měl vypočítat časové razítko výstupu z nejstarší vstupní ukázky, která obsahuje data použitá k vytvoření výstupní ukázky. Pokud chcete vypočítat výstupní časové razítko, přidejte vstupní časové razítko příslušné vstupní ukázky do doby trvání dat, která byla z této ukázky již transformována. Druhý příklad na konci této části znázorňuje tuto myšlenku.
  • Pokud vstupní vzorky mají dobu trvání, měla by se tato doba zachovat. Pokud vstupní vzorek nemá dobu trvání, MFT by měl vypočítat dobu trvání, pokud je to možné z velikosti výstupní vyrovnávací paměti nebo datové rychlosti zadané typem média.
  • Počítané doby trvání by se měly zkrátit (zaokrouhlit dolů), ne zaokrouhlit na nejbližší přírůstek. Kanál má dostatečnou časovou rezervu pro zpracování doby trvání, které jsou mírně nepřesné, ale pro kanál je jednodušší zpracovat dobu trvání, která je 1% příliš krátká než doba trvání, která je 1% příliš dlouhá. To znamená, že neexistuje důvod záměrně zkrátit doby trvání, kromě zaokrouhlením.

Dekodéry

Dekodér převádí komprimované pakety na nekomprimovaná data. Vzhledem k tomu, že výstup je nekomprimovaný, dekodéry mají zvláštní povinnost získat časové razítko a doby trvání správné. Některé komprimované formáty, zejména MPEG-2, nemají časové razítka u všech vstupních paketů a často nemají žádnou dobu trvání u žádného paketu. U těchto formátů je dekodér zodpovědný za vložení platného časového razítka a doby trvání u každého výstupního vzorku tak, že sečte předpokládané doby trvání všech výstupů od posledního vstupního vzorku s časovým razítkem.

Pokud není doba trvání v komprimovaném formátu k dispozici, dekodér by měl vypočítat dobu trvání jako inverzní k rychlosti snímků, převést na 100 nanosekundových jednotek a zaokrouhlit dolů.

Pokud není doba trvání ve komprimovaném formátu dostupná, dekodér by měl vypočítat dobu trvání jako inverzní funkci zvukové vzorkovací frekvence vynásobené počtem vzorků ve výstupní vyrovnávací paměti, převedeno na 100 nanosekundových jednotek a zaokrouhlit dolů.

Jediný čas, kdy by transformace měla vyvést ukázku bez časového razítka, je, že MFT nikdy nepřijal časové razítko vstupního vzorku nebo pokud neexistuje způsob, jak vypočítat přesné časové razítko výstupu z předchozího vstupního časového razítka.

Zvukové dekodéry

U zvukových dekodérů se doba trvání každého výstupního vzorku vypočítá z vzorkovací frekvence zvuku a počtu vzorků PCM na kanál ve výstupní vyrovnávací paměti.

Správný způsob výpočtu výstupních časových razítek závisí na tom, jestli vstupní vzorky obsahují časové razítko.

Pokud vstupní vzorky obsahují časové razítko, dekodér vypočítá výstupní časová razítka ze vstupních časových razítek následujícím způsobem:

  • Pokud každá vstupní vyrovnávací paměť obsahuje jeden nebo více kompletních komprimovaných snímků bez částečných rámců, výstupní časové razítko se rovná vstupnímu časovému razítku, minus známou latenci dekodéru. Dekodér Dolby Digital (AC-3) má například latenci 256 vzorků PCM. Například při vzorkovací frekvenci 48 kHz je latence 5,33 milisekund (msec). Proto pokud je vstupní časové razítko 1 000 msec, je výstupní časové razítko 1000 – 5,33 = 994,66 msec. Pokud vstupní vyrovnávací paměť obsahuje více než jeden celý komprimovaný rámec, dekodér vytvoří jeden výstupní vzorek pro každý rámec ve vstupní ukázce. Všechny výstupní vzorky budou správně označeny časovým razítkem, aby nedošlo k žádným mezerám.
  • V závislosti na přenosovém formátu může vstupní vyrovnávací paměť obsahovat částečné rámce. Vyrovnávací paměť může například obsahovat část rámce z předchozí vstupní vyrovnávací paměti, za kterou následuje jeden nebo více celých snímků následovaných začátkem dalšího rámce. V tomto případě je obecně správné předpokládat, že vstupní časové razítko odpovídá prvnímu rámečku, který začíná v rámci vyrovnávací paměti. (To znamená, že částečný rámec spuštěný v předchozí vyrovnávací paměti není zahrnut do časového razítka aktuální vyrovnávací paměti.) Výpočet výstupního časového razítka odpovídajícím způsobem.

Pokud vstupní vzorky neobsahují žádná časová razítka:

  • Dekodér by měl vygenerovat vlastní časové razítko a nastavit první časové razítko na nulu.
  • Doba trvání vzorku se vypočítá z počtu výstupních vzorků ve vyrovnávací paměti a vzorkovací frekvence.
  • Následná časová razítka se počítají z předchozího časového razítka a doby trvání: Aktuální časové razítko + aktuální doba trvání = příští časové razítko. Ve výstupních časových razítkech by neměly být žádné mezery.

Pokud vstupní datový proud zpočátku obsahuje časová razítka, ale z nějakého důvodu se přepne na žádné časové razítko, dekodér by měl pokračovat vygenerování vlastních výstupních časových razítek, aby byly souvislé a nedošlo k žádné mezerě.

Pokud vstupní datový proud obsahuje časová razítka, ale v časech existují mezery, dekodér tyto mezery jednoduše rozšíří. Jinými slovy, dekodér by se neměl pokoušet opravit nekonzistentní časové razítka ve vstupním datovém proudu.

Mixéry

Poznámka

V systému Windows Vista kanál Media Foundation nepodporuje MFT s více než jedním vstupem. Ve Windows 7 jsou podporovány vícesáté vstupy MFT.

 

Mixér přijímá více vstupů a kombinuje je do jednoho výstupu. Pokud vstupní datové proudy nejsou zcela uzamčené rychlostí nebo jsou mírně posunuty v čase od sebe, může být nejednoznačnost, o které je čas nastavit ve výstupu. Tady je několik pokynů v závislosti na typu média:

  • Audio. Při spuštění nebo bezprostředně po vyprazdnění nebo vyprazdnění by zvukový mixér měl čekat na výstup vzorků, dokud nepřijal vstupní vzorek u všech požadovaných vstupních proudů. V tomto okamžiku by měl zvolit nejstarší časové razítko počátečních vzorků, které se použije jako směrný plán pro výstupní časové razítko. Ostatní proudy by měly být vycpané tichem, aby se vymyslely případné nesrovnalosti. Pokud je vzorek přijat u volitelného vstupního datového proudu, měl by se také zohlednit do výpočtu. Od tohoto okamžiku by se MFT měl snažit vytvořit souvislý a nepřerušený řetězec výstupních časových razítek. Obecně platí, že MFT by se neměl pokoušet počítat s posunem jednoho proudu vzhledem k jinému. Místo toho by měl vypočítat výstupní časová razítka ze směrného časového razítka, výstupní rychlosti a velikosti vyrovnávací paměti. Když dojde k jinému vyprázdnění nebo vyprázdnění, MFT by měl resetovat směrné časové razítko.

  • Video. Při spuštění nebo bezprostředně po vyprazdnění nebo vyprazdnění by videoměšovač měl počkat na výstup vzorků, dokud nepřijal vstupní vzorek u všech požadovaných vstupních proudů. V tomto okamžiku by měl zvolit nejstarší časové razítko počátečních vzorků, které se použije jako směrný plán pro výstupní časové razítko. Obecně by se mělo snažit zachovat nepřetržitá a pravidelná výstupní časová razítka a pevné doby trvání, i když vstup není tak pravidelný, pokud je to nutné opakováním vstupních rámců.

Enkodéry

Kodér převede nekomprimovaný zvuk nebo video na komprimované pakety. Kodér by měl postupovat podle těchto pokynů:

  • Kodér by měl dodržovat konvence výstupního formátu. Pokud formát obvykle neobsahuje časové razítko každé ukázky, jako v MPEG-2, nemusí mít každý výstupní vzorek časové razítko a dobu trvání.

  • Vstupní časová razítka by měla být zachována ve výstupním formátu, pokud formát obsahuje pole pro časová razítka, pokud lepší informace o čase nejsou dostupné z jiného zdroje, jako je samotná aplikace.

Multiplexery

Poznámka

V systému Windows Vista kanál Media Foundation nepodporuje MFT s více než jedním vstupem. Ve Windows 7 jsou podporovány vícesáté vstupy MFT.

 

Multiplexer kombinuje dva různé zvukové nebo video streamy do jednoho prokládání formátu, jako je AVI nebo MPEG-2 Transport Stream. Multiplexer by měl postupovat podle těchto pokynů:

  • Multiplexer by měl dodržovat konvence výstupního formátu. Pokud formát obvykle neobsahuje časové razítko každé ukázky, jako v MPEG-2, nemusí mít každý výstupní vzorek časové razítko a dobu trvání.

  • Časové razítko by mělo odrážet nejstarší čas, který by byl umístěn na jakémkoli rámečku, který začíná v daném paketu, nebo čas prvního zvukového vzorku, který by byl dekódován z tohoto paketu. Tento návod ignorujte, pokud je v konfliktu s konvencemi výstupního formátu.

Demultiplexery

Demultiplexer rozdělí prokládání formátu, jako je AVI nebo MPEG-2 Transport Stream, do podkladových zvukových a video streamů.

Pokud formát obsahuje konkrétní informace o časovém razítku, které lze použít k výpočtu přesných výstupních časových razítek na základě vstupních časových razítek, měly by se použít. Pokud však formát obsahuje časy v úplně odlišném základu, který nemá žádný vztah ke vstupním časovým razítkům a přesný posun na vstupní časové razítko nelze vypočítat, měly by být vlastní časy formátu ignorovány.

Pokud formát neobsahuje použitelné informace o časovém razítku, měl by demultiplexer postupovat podle těchto pravidel:

  • Nekomprimované výstupní streamy by měly mít v případě potřeby platné časové razítko a doby trvání vypočítané z nejbližšího předchozího vstupního časového razítka.

  • Komprimované výstupní streamy by měly mít časové razítko pouze u první výstupní ukázky odvozené ze vstupního vzorku s časovým razítkem. Pokud vstupní ukázka nemá časové razítko, neměly by žádné výstupní vzorky odvozené z této vstupní ukázky obsahovat časové razítko. Pokud je vstupní ukázka rozdělená do více výstupních vzorků, měla by mít časové razítko pouze první výstupní ukázka a zbytek by neměl obsahovat žádná časová razítka.

Příklady

Příklad 1. Předpokládejme, že efekt videa vždy přebírá nekomprimovaný vstupní rámec, použije efekt a zkopíruje ho do výstupu. Nikdy neudržuje žádné snímky ani vyrovnávací paměť žádné vstupy. Tento MFT jednoduše zkopíruje časové razítko a dobu trvání ze vstupní ukázky do výstupního vzorku, pokud jsou k dispozici, a vůbec neprovádí výpočty času.

Příklad 2. Předpokládejme, že zvukový efekt transformuje všechny kromě 10 milisekund (ms) každé vstupní vyrovnávací paměti, čímž se extra 10 ms zkombinuje s další vyrovnávací pamětí. Získá datový proud vzorků, které mají délku 50 ms. Vstupní časy jsou uvedené v následující tabulce.

Ukázka Vstupní čas Doba trvání vstupu Výstupní čas Doba trvání výstupu
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Všimněte si nesrovnalosti 1 ms mezi skutečnou dobou trvání vzorku 2 a předpokládanou dobou trvání na základě dalšího časového razítka (121 ? 70 = 51).

Vzhledem k tomu, že MFT uchovává 10 ms, vypíše prvních 40 ms vstupního vzorku 1 jako výstupní vzorek 1 s časovým razítkem 20 ms a dobou trvání 40 ms.

Výstupní ukázka 2 kombinuje 10 ms dříve uchovávané zpět se 40 ms vstupního vzorku 2. Tato ukázka má časové razítko 60 ms (časové razítko předchozího vstupního vzorku, 20 ms a dobu trvání již zpracovaných dat z tohoto vzorku, 40 ms). Je zadána doba trvání 50 ms.

Podobně má další ukázka časové razítko 110 ms (70 ms + 40 ms) s dobou trvání 50 ms.

Další výpočet je zajímavější. Předpokládané časové razítko z předchozího výstupního času a doby trvání by bylo 160 ms (časové razítko 110 ms + doba trvání 50 ms). Výstupní časové razítko se ale má vypočítat ze vstupního časového razítka nejstaršího vstupního vzorku, který se v čase překrývají s výstupním vzorkem a délkou všech dat, která jsou z tohoto vzorku již zpracována. Nejbližší překrývající se vstupní vzorek je vzorek 4 (časové razítko = 171), ale není to nejstarší. Nejstarší překrývající se vzorek je vzorek 3 (časové razítko = 121). Přidání 40ms, které už bylo z tohoto vzorku zpracováno, je výsledek 161.

psaní vlastního MFT