Dela via


Implementering av hastighetsstyrning

Det här avsnittet beskriver hur anpassade pipelineobjekt kan stödja varierande uppspelningshastigheter, inklusive omvänd uppspelning. Information om hur du använder hastighetskontroll från ett program finns i Rate Control.

Det här avsnittet innehåller följande avsnitt:

Om du skriver ett Microsoft Media Foundation-pipelineobjekt (en mediekälla, transformering eller mediemottagare) kan du behöva stödja varierande uppspelningshastigheter. Det gör du genom att implementera följande gränssnitt:

  1. Implementera gränssnittet IMFGetService.
  2. Stöd för tjänsten MF_RATE_CONTROL_SERVICE. (Se tjänstegränssnitt.)
  3. Implementera IMFRateSupport-gränssnittet, som hämtar uppspelningshastigheterna som stöds av objektet.
  4. Implementera IMFRateControl--gränssnittet, som hämtar eller anger uppspelningshastigheten.

Mediekällor

Om en mediekälla stöder frekvenskontroll bör den implementera både IMFRateSupport och IMFRateControl. Annars rapporterar Media Session att den lägsta och högsta uppspelningshastigheten är 1,0, oavsett vilka andra komponenter som finns i pipelinen.

Uppspelningshastigheten påverkar inte presentationstiderna för exemplen, så mediekällan bör inte justera sina tidsstämplar. Presentationsklockan körs i stället snabbare eller långsammare. För omvänd uppspelning levererar källan exempel i omvänd ordning, med minskande tidsstämplar.

Parametern fThin i metoden IMFRateControl::SetRate anger om mediekällan ska tunn innehållet. Gallring gäller främst för videoströmmar. I tunt läge släpper källan deltaramar och levererar endast nyckelramar. Med mycket höga uppspelningshastigheter kan källan hoppa över vissa nyckelramar (till exempel leverera alla andra nyckelramar).

Källan behöver inte släppa ljudexempel i tunt läge. Med mycket höga uppspelningshastigheter kanske källan inte kan läsa data tillräckligt snabbt för att fylla pipelinens exempelbegäranden. I så fall kan källan behöva släppa vissa ljuddata. I så fall bör den försöka leverera ljudexempel som är nära i tid till videoexemplen (förutsatt att källan har båda typerna av ström).

När ett flöde övergår mellan tunnat och normal läge skickar det en MEStreamThinMode-händelse.

När mediekällan slutför ett anrop till SetRateskickar den händelsen MESourceRateChanged.

Under omvänd uppspelning:

  • Mediekällan levererar exempel i omvänd ordning, utan att justera tidsstämplarna.
  • Tidsstämplar i en ström bör monotont minska.
  • Början av innehållet betraktas som slutet på dataströmmen. När varje medieström levererar det första exemplet i strömmen (det vill säga presentationstid = 0) skickar den händelsen MEEndOfStream.

Media Foundation-omvandlingar

I allmänhet behöver en Media Foundation-transform (MFT) inte uttryckligt stöd för hastighetskontroll, såvida inte MFT har stöd för icke-reducerad omvänd uppspelning.

Om en MFT inte implementerar IMFRateSupport-gränssnittet förutsätter mediasessionen följande:

  • MFT stöder godtyckliga uppspelningshastigheter för uppspelning framåt, både gallrade och icke-gallrade.
  • MFT stöder uttunnad omvänd uppspelning, men stöder inte icke-tunnad omvänd uppspelning.

Om något av dessa villkor inte är sant bör MFT implementera IMFRateSupport och IMFRateControl.

Omvänd uppspelning

Mediesessionen kan spelas upp omvänt även om en eller flera transformeringar i pipelinen inte uttryckligen stöder omvänd uppspelning.

Om en MFT inte exponerar IMFRateSupport--gränssnittet använder Media Session gallring för omvänd uppspelning enligt följande:

  • Mediasessionen skickar nyckelramar till MFT på vanligt sätt genom att anropa IMFTransform::ProcessInput.

  • Mediasessionen släpper deltaramar och ersätter dem med MEStreamTick- händelser.

  • Mellan varje exempel rensar mediasessionen MFT för att undvika eventuella fel som orsakas av att tidsstämplarna minskar.

Ett exempel anses vara en nyckelram om attributet MFSampleExtension_CleanPoint har angetts till TRUEoch betraktas som en deltaram om det här attributet FALSE eller inte har angetts.

Om MFT implementerar IMFRateSupportanvänder mediasessionen det här gränssnittet för att ta reda på om MFT stöder icke-tunnad omvänd uppspelning. Om MFT stöder icke-tunnad omvänd uppspelning, levererar Mediesessionen alla prover, i omvänd ordning, utan att ta bort prover eller rensa MFT:n.

Om en MFT stöder omvänd uppspelning utan utglesning, bör den implementera gränssnittet IMFRateControl. Mediasessionen använder det här gränssnittet för att meddela MFT när omvänd uppspelning sker. Vid den tidpunkten måste MFT förberedas för att tidsstämplarna ska minska och för att deltaramar ska komma i omvänd ordning. En avkodare behöver vanligtvis buffringsexempel tills den har tagit emot en hel grupp bilder (GOP), sedan avkoda hela GOP och mata ut de avkodade ramarna i rätt (omvänd) ordning.

Mediemottagare

Om en mediemottagare är frekvenslösförutsätter mediasessionen att mediemottagaren kan hantera alla uppspelningshastigheter. Mediakomponenten behöver inte implementera IMFRateSupport. (En frekvenslös mediemottagare returnerar flaggan MEDIASINK_RATELESS från IMFMediaSink::GetCharacteristics-metoden.)

Annars bör en mediemottagare implementera IMFRateSupport om den kan hantera andra uppspelningshastigheter än 1,0.

Mediemottagare bör inte implementera IMFRateControl. När uppspelningshastigheten ändras anropar presentationsklockan mediemottagarens IMFClockStateSink::OnClockSetRate-metoden.

hastighetskontroll

Söks, framåtspolning och bakåtspolning