Sdílet prostřednictvím


Jímky médií

jímky médií jsou objekty kanálu, které přijímají data médií. Jímka médií je cílem jednoho nebo více datových proudů médií. Jímky médií spadají do dvou obecných kategorií:

  • renderer je jímka médií, která prezentuje data pro přehrávání. Vylepšený renderer videa (EVR) zobrazuje snímky videa a renderer přehrává zvukové streamy prostřednictvím zvukové karty nebo jiného zvukového zařízení.

  • archivní jímka je jímka médií, která zapisuje data do souboru nebo jiného úložiště.

Hlavní rozdíl mezi nimi spočívá v tom, že jímka archivu data nevyužívají s pevnou rychlostí přehrávání. Místo toho zapíše data, která obdrží co nejrychleji.

Jímky médií zpřístupňují rozhraní MMFMediaSink. Každá jímka médií obsahuje jednu nebo více jímek datových proudů. Každá jímka streamu přijímá data z jednoho datového proudu. Jímky streamu zpřístupňují rozhraní MMFStreamSink. Aplikace obvykle nevytvoří jímky médií přímo. Místo toho aplikace vytvoří jeden nebo více aktivačních objektů, které relace médií používá k vytvoření jímky. Všechny ostatní operace v jímce jsou zpracovávány relací médií a aplikace nevolá žádné metody v jímce médií ani žádné jímce datového proudu. Další informace o aktivačních objektech naleznete v tématu aktivační objekty.

Zbývající část tohoto tématu byste si měli přečíst, pokud píšete vlastní jímku médií nebo pokud chcete použít jímku médií přímo bez relace médií.

Jímky datových proudů

Jímka médií může mít pevný počet jímek datového proudu nebo může podporovat přidávání a odebírání jímek datových proudů. Pokud má pevný počet jímek datových proudů, vrátí MMFMediaSink::GetCharacteristics metoda vrátí příznak MEDIASINK_FIXED_STREAMS. Jinak můžete přidávat a odebírat jímky datových proudů. Chcete-li přidat novou jímku datového proudu, zavolejte MMFMediaSink::AddStreamSink. Chcete-li odebrat jímku datového proudu, zavolejte MMFMediaSink::RemoveStreamSink. Příznak MEDIASINK_FIXED_STREAMS označuje, že jímka médií tyto dvě metody nepodporuje. (Může podporovat nějaký jiný způsob konfigurace počtu datových proudů, například nastavením inicializačních parametrů při vytvoření jímky.) Seznam jímek toků je seřazený. Chcete-li je vytvořit výčet podle hodnoty indexu, zavolejte MMFMediaSink::GetStreamSinkByIndex metoda.

Jímky streamu mají také identifikátory. Identifikátory datových proudů jsou v rámci jímky médií jedinečné, ale nemusí být po sobě jdoucí. V závislosti na jímce médií můžou identifikátory datových proudů mít nějaký význam, který souvisí s obsahem. Archivní jímka může například zapisovat identifikátory datového proudu do hlavičky souboru. Jinak jsou libovolné. Chcete-li získat jímku datového proudu podle jeho identifikátoru, zavolejte MMFMediaSink::GetStreamSinkById.

Hodiny prezentace

Rychlost, s jakou jímka médií spotřebovává vzorky, je řízena prezentační hodiny. Media Session vybere hodiny prezentace a nastaví ji na jímce médií zavoláním MMFMediaSink::SetPresentationClock metody. Před zahájením streamování musí být hodiny prezentace nastaveny na jímce médií. Každá jímka médií vyžaduje, aby se spustily hodiny prezentace. Jímka médií používá hodiny prezentace pro dva účely:

  • Příjem oznámení při spuštění nebo zastavení streamování Jímka médií obdrží tato oznámení prostřednictvím MMFClockStateSink rozhraní, které musí implementovat všechny jímky médií.

  • Pokud chcete určit, kdy má vykreslit vzorky. Když jímka médií obdrží novou ukázku, získá časové razítko z ukázky a pokusí se vykreslí ukázku v době prezentace.

Hodiny prezentace odvozují své hodiny z jiného objektu nazývaného zdroj času prezentace. Zdroje času prezentace zpřístupňují rozhraní MMFPresentationTimeSource. Některé jímky médií mají přístup k přesným hodinám, takže zpřístupňují toto rozhraní. To znamená, že jímka médií může plánovat vzorky podle času poskytnutého vlastním hodinem. Jímka médií však nemůže předpokládat, že se jedná o případ. Musí vždy používat čas od hodin prezentace bez ohledu na to, zda hodiny prezentace řídí samotná jímka médií nebo jiné hodiny.

Pokud jímka médií nemůže odpovídat sazbám s jinými hodinami než vlastními, vrátí metoda GetCharacteristics metodu MEDIASINK_CANNOT_MATCH_CLOCK příznak. Pokud je tento příznak přítomný a hodiny prezentace používají jiný zdroj času prezentace, je pravděpodobné, že jímka médií bude fungovat špatně. Může například dojít k výpadku během přehrávání.

bez rateless jímka je jímka médií, která ignoruje časová razítka vzorků a spotřebovává data, jakmile dorazí každý vzorek. Jímka médií bez rychlosti vrátí příznak MEDIASINK_RATELESS z metody GetCharacteristics. Tento příznak se obvykle vztahuje na archivní jímky. Pokud je každá jímka médií v kanálu bez rychlosti, relace médií používá speciální hodiny prezentace bez rychlosti. Tyto hodiny běží tak rychle, jak jímky spotřebovávají vzorky.

Formáty datových proudů

Než může jímka médií přijímat vzorky, klient musí nastavit typ média v jímkách datového proudu. Chcete-li nastavit typ média, zavolejte jímku datového proudu SOAPStreamSink::GetMediaTypeHandler metoda. Tato metoda vrátí ukazatel na MMFMediaTypeHandler rozhraní. Toto rozhraní slouží k získání seznamu upřednostňovaných typů médií, získání aktuálního typu média a nastavení typu média.

Chcete-li získat seznam upřednostňovaných typů médií, zavolejte MMFMediaTypeHandler::GetMediaTypeByIndex. Upřednostňované typy by se měly považovat za nápovědu pro klienta. Seznam může být neúplný nebo může obsahovat částečné typy médií. Částečný typ média je takový, který nemá všechny atributy potřebné k popisu platného formátu. Například částečný typ videa může určit barevný prostor a bitovou hloubku, ale ne šířku nebo výšku obrázku. Částečný typ zvuku může specifikovat formát komprese a vzorkovací frekvenci, ale ne počet zvukových kanálů.

Chcete-li získat aktuální typ média jímky datového proudu, zavolejte MMFMediaTypeHandler::GetCurrentMediaType. Při prvním vytvoření jímky datového proudu může mít již nastavený výchozí typ média nebo nemusí mít žádný typ média, dokud ho klient nenastaví.

Chcete-li nastavit typ média, volání MMFMediaTypeHandler::SetCurrentMediaType. Některé jímky datových proudů nemusí podporovat změnu typu po nastavení. Proto je užitečné otestovat typy médií před jejich nastavením. Chcete-li otestovat, zda jímka média přijme typ média (bez nastavení typu), volání MMFMediaTypeHandler::IsMediaTypeSupported.

Tok dat

Jímky médií používají model vyžádání, což znamená, že stream jímky vyžadují data podle potřeby. Klient by měl reagovat včas, aby se zabránilo případnému svědění.

Některé jímky médií podporují předrollování. Před zápisem je proces předání dat jímce médií před zahájením hodin prezentace. Pokud jímka médií podporuje předrollování, jímka médií zveřejňuje rozhraní MMFMediaSinkPreroll rozhraní a GetCharacteristics metoda vrátí příznak MEDIASINK_CAN_PREROLL. Předběžné registrace zajistí, že je jímka médií připravená k prezentaci první ukázky při spuštění hodin prezentace. Doporučuje se, aby klient vždy přederolloval, pokud ho jímka médií podporuje, protože může zabránit svědění nebo mezerám během přehrávání.

Tok dat do jímky médií funguje takto:

  1. Klient nastaví typy médií a hodiny prezentace. Jímka médií se zaregistruje u hodin prezentace, aby dostávala oznámení o změnách stavu hodin.
  2. Volitelně se klient dotazuje na MMFMediaSinkPreroll. Pokud jímka médií zpřístupňuje toto rozhraní, klient volá MMFMediaSinkPreroll::NotifyPreroll. Jinak klient přeskočí ke kroku 5.
  3. Každá jímka streamu odesílá jednu nebo více událostí MEStreamSinkRequestSamp le. V reakci na každou z těchto událostí klient získá další ukázku dat pro tento datový proud a volá DATACENTERStreamSink::P rocessSample.
  4. Když každá jímka datového proudu obdrží dostatek předem připravených dat, odešle MEStreamSinkPrerolled událostí.
  5. Klient volá MMFPresentationClock::Start, aby se spustily hodiny prezentace.
  6. Hodiny prezentace oznámí jímce médií, že hodiny začínají, voláním MMFClockStateSink::OnClockStart.
  7. Pro získání dalších dat odesílá každá jímka datového proudu MEStreamSinkRequestSample událostí. V reakci na každou z těchto událostí klient získá další ukázku a zavolá ProcessSample. Tento krok se opakuje, dokud prezentace nekončí.

Většina jímek médií zpracovává vzorky asynchronně, takže jímky datových proudů můžou odeslat více než jeden ukázkový požadavek najednou.

Během streamování může klient kdykoli volat MMFStreamSink::P laceMarker a MMFStreamSink::Flush. Značky jsou popsány v další části. Vyprázdnění způsobí, že jímka datového proudu vyřadí všechny vzorky, které se zařadí do fronty, ale zatím se nevykreslí.

Záložky

Značky poskytují klientovi způsob, jak indikovat konkrétní body v datovém proudu. Značka se skládá z následujících informací:

  • Typ značky definovaný jako člen MFSTREAMSINK_MARKER_TYPE výčtu.
  • Data přidružená ke značce Význam dat závisí na typu značky. Některé typy značek neobsahují data.
  • Volitelná data pro vlastní použití klienta.

Aby klient umístil značku, volá MMFStreamSink::P laceMarker. Jímka datového proudu dokončí zpracování všech vzorků přijatých před voláním PlaceMarker a odešle MEStreamSinkMarker událostí.

Většina jímek médií uchovává frontu čekajících vzorků, které zpracovávají asynchronně. Události značek musí být serializovány se zpracováním vzorků, takže jímka médií by měla umístit značky do stejné fronty. Předpokládejme například, že klient volá následující metodu:

  1. ProcessSample (ukázka č. 1)
  2. processSample (ukázka č. 2)
  3. PlaceMarker (značka č. 1)
  4. processSample (ukázka č. 3)
  5. PlaceMarker (značka č. 2)

V tomto příkladu musí jímka datového proudu odeslat MEStreamSinkMarker událost pro značku č. 1, jakmile zpracuje ukázku č. 2 a událost pro značku #2 po zpracování vzorku č. 3.

Pokud klient vyprázdní jímku datového proudu, jímka datového proudu okamžitě zpracuje všechny značky, které byly ve frontě. Nastaví stavový kód tak, aby E_ABORT u těchto událostí.

Některé značky obsahují informace, které jsou relevantní pro jímku médií:

  • MFSTREAMSINK_MARKER_TICK: Indikuje, že v datovém proudu je mezera. Dalším vzorkem bude přerušení.
  • MFSTREAMSINK_MARKER_ENDOFSEGMENT: Označuje konec segmentu nebo konec datového proudu. Další ukázka (pokud existuje) může být přerušení.
  • MFSTREAMSINK_MARKER_EVENT: Obsahuje událost. V závislosti na typu události a implementaci jímky médií může jímka médií zpracovat událost nebo ji ignorovat.

Změny stavu

Jímka médií je informována o změnách stavu v prezentačních hodinách prostřednictvím rozhraní MMFClockStateSink. Když klient nastaví hodiny prezentace, jímka médií volá MMFPresentationClock::AddClockStateSink zaregistrovat se pro oznámení z hodin. Následující tabulka shrnuje chování jímky médií v reakci na změny stavu hodin.

Změna stavu hodin Ukázkové zpracování Zpracování značek
OnClockStart Vzorky procesů, jejichž časové razítko je rovno nebo pozdější než čas zahájení hodin. Odešlete událost MEStreamSinkMarker, když byly všechny vzorky přijaté před zpracováním značky.
OnClockPause Jímka médií může při pozastavení selhat processSample.
Pokud jímka médií přijímá vzorky při pozastavení, musí je zařazovat do fronty, dokud se hodiny nerestartují. Během pozastavení nezpracujte žádné ukázky ve frontě.
Pokud existují ukázky ve frontě, vložte značky do stejné fronty. Odešle událost značky při restartování hodin.
V opačném případě okamžitě odešlete událost značky.
onClockRestart Zpracovat všechny ukázky, které byly zařazeny do fronty při pozastavení, a pak zacházet se stejným způsobem jako s OnClockStart. Odeslání MEStreamSinkMarker událostí pro značky ve frontě (serializované pomocí ukázkového zpracování) a pak zacházet se stejným způsobem jako s OnClockStart.
onClockStop Odstraňte všechny ukázky ve frontě. Další volání ProcessSample může selhat. Odesílání událostí značek ve frontě Při následných voláních PlaceMarkerodešlete událost značky okamžitě.

 

Kromě toho musí jímky datových proudů po dokončení přechodů stavu odesílat následující události:

Dokončení

Některé jímky médií vyžadují další krok zpracování po doručení posledního vzorku. Tento požadavek se obvykle vztahuje na archivní jímky, které musí do souboru zapisovat hlavičky nebo indexy. Pokud jímka médií vyžaduje jakékoli konečné zpracování, zveřejní MMFFinalizableMediaSink rozhraní.

Jakmile klient doručí poslední ukázku, klient se na toto rozhraní dotazuje. Pokud jímka médií podporuje rozhraní, klient volá MMFFinalizableMediaSink::BeginFinalize k provedení konečného zpracování asynchronně. Tato metoda se řídí standardním asynchronním modelem Media Foundation, který je popsán v asynchronní metody zpětného volání. Jímka médií může předpokládat, že klient bude volat BeginFinalize. Volání BeginFinalize může vést k nesprávně vytvořenému souboru.

Vypnutí

Po dokončení klienta pomocí jímky médií klient volá MMFMediaSink::Shutdown. Uvnitř této metody by měla jímka médií přerušit všechny počty cyklických odkazů. Obvykle se mezi jímkou médií a jímkou datových proudů budou cyklický odkaz.

Pokud používáte pomocný objekt fronty událostí k implementaci MMFMediaEventGenerator, zavolejte MMFMediaEventQueue::Shutdown ve frontě událostí. Tato metoda vypne frontu událostí a signalizuje všechny volající, kteří aktuálně čekají na událost.

Po vypnutí vrátí všechny metody jímky médií MF_E_SHUTDOWN s výjimkou metod IUnknown.

Rozhraní jímky médií

Následující tabulka uvádí standardní rozhraní, která mohou jímky médií zpřístupnit prostřednictvím QueryInterface. Jímky médií můžou také vystavit vlastní rozhraní.

Rozhraní Popis
MMFMediaSink Primární rozhraní pro jímky médií. (Povinné.)
MMFClockStateSink Slouží k upozorňovat jímku médií při změně stavu hodin prezentace. (Povinné.)
MMFFinalizableMediaSink Implementujte, pokud musí jímka médií provést poslední krok zpracování. (Volitelné.)
MMFGetService Implementujte, pokud jímka médií zveřejňuje všechna rozhraní služeb. (Volitelné.)
MMFMediaEventGenerator Implementujte, pokud jímka médií odesílá všechny události. (Volitelné.)
MMFMediaSinkPreroll Implementujte, pokud jímka médií podporuje předběžné registrace. (Volitelné.)
MMFPresentationTimeSource Implementujte, pokud jímka médií může poskytnout zdroj času pro hodiny prezentace. (Volitelné.)
MMFQualityAdvise Implementujte, pokud jímka médií může upravit kvalitu přehrávání. (Volitelné.)

 

Volitelně může jímka médií implementovat následující rozhraní jako službu.

Rozhraní služby Popis
SUPPORT Zaznamenává rozsah podporovaných rychlostí přehrávání.

 

Další informace o rozhraních služeb a MMFGetServicenaleznete v tématu Service Interfaces.

Rozhraní jímky Stream

Jímky streamu musí vystavit následující rozhraní prostřednictvím QueryInterface.

Rozhraní Popis
MMFStreamSink Primární rozhraní pro jímky datových proudů. (Povinné.)
MMFMediaEventGenerator Zařadí události do fronty. Rozhraní MMFStreamSink zdědí toto rozhraní. (Povinné.)

 

V současné době nejsou pro jímky datových proudů definována žádná rozhraní služby.

Události jímky streamu

Následující tabulka uvádí události definované pro obecné jímky datových proudů. Jímky streamu můžou také posílat vlastní události, které tu nejsou uvedené.

Událost Popis
MEStreamSinkFormatChanged Typ média jímky datového proudu už není platný. (Volitelné.)
MEStreamSinkMarker Byla zpracována značka. (Povinné.)
MEStreamSinkPaused Jímka datového proudu se pozastavila. (Povinné.)
MEStreamSinkPrerolled Preroll je dokončený. (Volitelné.)
MEStreamSinkRateChanged Jímka streamu změnila rychlost přehrávání. (Volitelné.)
MEStreamSinkRequestSample Vyžaduje se nová ukázka. (Povinné.)
MEStreamSinkScrubSampleCompleComplete Žádost o scrub byla dokončena. (Volitelné.)
MEStreamSinkStarted Jímka datového proudu se spustila. (Povinné.)
MEStreamSinkStopped Jímka datového proudu se zastavila. (Povinné.)

 

V současné době nejsou pro jímky médií definovány žádné události pro obecné účely. Některé jímky médií můžou posílat vlastní události.

kanálu Media Foundation

architektury Media Foundation