Delen via


Snelheidsbeheer implementeren

In dit onderwerp wordt beschreven hoe aangepaste pijplijnobjecten ondersteuning kunnen bieden voor variabele afspeelsnelheden, waaronder omgekeerd afspelen. Zie Rate Controlvoor informatie over het gebruik van snelheidsbeheer vanuit een toepassing.

Dit onderwerp bevat de volgende secties:

Als u een Microsoft Media Foundation-pijplijnobject schrijft (een mediabron, transformatie of media-sink), moet u mogelijk variabele afspeelsnelheden ondersteunen. Implementeer hiervoor de volgende interfaces:

  1. Implementeer de IMFGetService interface.
  2. Ondersteuning voor de MF_RATE_CONTROL_SERVICE-service. (Zie Service Interfaces.)
  3. Implementeer de interface IMFRateSupport, waarmee de afspeelsnelheden worden opgehaald die door het object worden ondersteund.
  4. Implementeer de IMFRateControl interface, waarmee de afspeelsnelheid kan worden opgehaald of ingesteld.

Mediabronnen

Als een mediabron snelheidscontrole ondersteunt, moet deze zowel IMFRateSupport als IMFRateControlimplementeren. Anders rapporteert de mediasessie dat de minimale en maximale afspeelsnelheid 1,0 is, ongeacht wat andere onderdelen in de pijplijn zijn.

De afspeelsnelheid heeft geen invloed op de presentatietijden van de voorbeelden, dus de mediabron mag de tijdstempels niet aanpassen. In plaats daarvan loopt de presentatieklok sneller of langzamer. Voor omgekeerd afspelen levert de bron voorbeelden in omgekeerde volgorde, met afnemende tijdstempels.

De parameter fThin van de methode IMFRateControl::SetRate geeft aan of de mediabron dunne de inhoud moet. Thinning is voornamelijk van toepassing op videostreams. In de thinned-modus laat de bron deltaframes vallen en worden alleen sleutelframes geleverd. Bij zeer hoge afspeelsnelheden kan de bron enkele sleutelframes overslaan (bijvoorbeeld elk ander sleutelframe leveren).

De bron hoeft geen audiosamples te verwijderen in de 'thinned' modus. Bij zeer hoge afspeelsnelheden kan de bron mogelijk niet snel genoeg gegevens lezen om de voorbeeldaanvragen van de pijplijn te vullen. In dat geval moet de bron mogelijk enkele audiogegevens verwijderen. Als dit het geval is, moet worden geprobeerd audiosamples te leveren die dicht bij de videovoorbeelden liggen (ervan uitgaande dat de bron beide typen stream heeft).

Wanneer een stroom overschakelt tussen de modus "verdund" en "niet-verdund", wordt er een MEStreamThinMode gebeurtenis verzonden.

Wanneer de mediabron een aanroep naar SetRatevoltooit, wordt de gebeurtenis MESourceRateChanged verzonden.

Tijdens omgekeerd afspelen:

  • De mediabron levert voorbeelden in omgekeerde volgorde, zonder de tijdstempels aan te passen.
  • Tijdstempels binnen een stroom moeten monotonisch afnemen.
  • Het begin van de inhoud wordt beschouwd als het einde van de stream. Nadat elke mediastream het eerste voorbeeld in de stream heeft geleverd (dat wil zeggen presentatietijd = 0), wordt de MEEndOfStream-gebeurtenis verzonden.

Transformaties van Media Foundation

Over het algemeen heeft een Media Foundation-transformatie (MFT) geen expliciete ondersteuning nodig voor snelheidscontrole, tenzij de MFT niet-verdunde omgekeerde weergave implementeert.

Als een MFT de IMFRateSupport-interface niet implementeert, gaat de mediasessie uit van het volgende:

  • De MFT ondersteunt willekeurige afspeelsnelheden voor voorwaarts afspelen, zowel uitgedund als niet-uitgedund.
  • De MFT ondersteunt thinned reverse afspelen, maar biedt geen ondersteuning voor niet-thinned reverse afspelen.

Als een van deze voorwaarden niet waar is, moet de MFT IMFRateSupport en IMFRateControlimplementeren.

Omgekeerd afspelen

De mediasessie kan omgekeerd worden afgespeeld, zelfs als een of meer transformaties in de pijplijn geen expliciete ondersteuning bieden voor omgekeerd afspelen.

Als een MFT de IMFRateSupport interface niet beschikbaar maakt, gebruikt de mediasessie als volgt thinning- voor omgekeerd afspelen:

  • De mediasessie verzendt sleutelbeelden op de gebruikelijke manier naar de MFT door IMFTransform::ProcessInputaan te roepen.

  • De mediasessie verwijdert deltaframes en vervangt deze door MEStreamTick gebeurtenissen.

  • Tussen elk voorbeeld wordt de MFT door de Mediasessie leeggemaakt om fouten te voorkomen die worden veroorzaakt door het feit dat de tijdstempels afnemen.

Een voorbeeld wordt beschouwd als een sleutelframe als het kenmerk MFSampleExtension_CleanPoint is ingesteld op TRUEen wordt beschouwd als een deltaframe als dit kenmerk is ONWAAR of niet is ingesteld.

Als de MFT IMFRateSupportimplementeert, gebruikt de mediasessie deze interface om te ontdekken of de MFT niet-uitgedunde omgekeerde afspeelmogelijkheden ondersteunt. Als de MFT ondersteuning biedt voor niet-verminderde reverse afspelen, levert de Mediasessie alle samples in omgekeerde volgorde, zonder samples te verwijderen of de MFT leeg te maken.

Als een MFT ondersteuning biedt voor niet-uitgedunde omgekeerde weergave, moet het de IMFRateControl-interface implementeren. De mediasessie gebruikt deze interface om de MFT op de hoogte te stellen wanneer omgekeerd afspelen plaatsvindt. Op dat moment moet de MFT worden voorbereid op het afnemen van de tijdstempels en voor deltaframes die in omgekeerde volgorde binnenkomen. Een decoder moet doorgaans steekproeven bufferen totdat deze een hele groep afbeeldingen (GOP) heeft ontvangen, en vervolgens de hele GOP decoderen en de gedecodeerde frames in de juiste (omgekeerde) volgorde uitvoeren.

Mediasinks

Als een mediasink ratelessis, gaat de mediasessie ervan uit dat de mediasink elke afspeelsnelheid kan verwerken. De mediasink hoeft geen IMFRateSupportte implementeren. (Een rateless media sink retourneert de vlag MEDIASINK_RATELESS van de methode IMFMediaSink::GetCharacteristics.)

Anders zou een mediasink IMFRateSupport moeten implementeren indien het andere afspeelsnelheden dan 1,0 kan verwerken.

Media-sinks mogen geen IMFRateControlimplementeren. Wanneer de afspeelsnelheid verandert, roept de presentatieklok de IMFClockStateSink::OnClockSetRate methode aan.

Snelheidscontrole

Zoeken, snel vooruit en terugspoelen