Sequentiepresentatietijden
In dit onderwerp wordt beschreven hoe de Sequencer Source presentatietijden verwerkt tijdens het afspelen.
Overzicht
De sequencer-bron ondersteunt twee verschillende modi: afspeellijstreeksen en bewerkingsreeksen.
In een bewerkingsreeks geeft de toepassing de duur van elk segment vooraf aan voordat het afspelen wordt gestart. In een afspeellijstreeks geeft de toepassing de duur van tevoren niet op. (In feite is de duur mogelijk niet bekend.)
In beide gevallen kunt u de begin- en mediastoptijd van een segment opgeven. In deze tijden geeft u de positie op in het bronbestand waar het segment begint en eindigt. Stel dat het bronbestand 90 seconden lang is. Als u de eerste 10 seconden en de laatste tien seconden wilt bijsnijden, geeft u de volgende waarden op:
- Media starten: 10 seconden
- Mediastop: 80 seconden
Als u de begintijd van de media wilt opgeven, stelt u het kenmerk MF_TOPONODE_MEDIASTART in op het bronknooppunt. Als u de tijd van de mediastop wilt opgeven, stelt u het kenmerk MF_TOPONODE_MEDIASTOP in op het bronknooppunt.
Als u een bewerkingsreeks wilt maken, stelt u het kenmerk MF_SESSION_GLOBAL_TIME in wanneer u de mediasessie maakt. Anders verwacht de mediasessie afspeellijstreeksen. In een bewerkingsreeks moet elke segmenttopologie het kenmerk MF_TOPOLOGY_PROJECTSTART en het kenmerk MF_TOPOLOGY_PROJECTSTOP hebben.
Afspeellijstreeksen
In een afspeellijstreeks begint de presentatieklok bij nul en gaat verder over segmentgrenzen. De systeemeigen bronnen leveren voorbeelden met tijdstempels die gelijk zijn aan de mediatijd. Met de pijplijn worden de tijdstempels als volgt geconverteerd naar de juiste presentatietijd:
- Nieuwe tijdstempel = mediatijd + offset − begin van media
De waarde van offset is het tijdstip waarop het vorige segment is beëindigd. Voor het eerste segment is de offset nul. Hier volgen twee voorbeelden van hoe deze tijdstempelconversies worden berekend:
- Voorbeeld 1: Stel dat het eerste segment (S1) 10 seconden lang is en dat het tweede segment (S2) een begintijd van nul media heeft. De systeemeigen bron gebruikt de mediatijd voor de tijdstempels, dus het eerste voorbeeld van S2 heeft een tijdstempel van nul. De offset is 10 seconden (de duur van S1), dus de aangepaste tijdstempel is:0 + 10 − 0 = 10 seconden.
- Voorbeeld 2: Stel dat segment S1 10 seconden lang is en dat S2 een begintijd van 5 seconden media heeft. Het eerste voorbeeld van S2 heeft een tijdstempel van 5 seconden (mediatijd). De offset is 10 seconden, dus de aangepaste tijdstempel is:5 + 10 − 5 = 10 seconden.
Alle pijplijnonderdelen downstream van de bronknooppunten ontvangen voorbeelden met de aangepaste tijdstempels. De bronknooppunten in een topologie kunnen verschillende begintijden voor media hebben, zodat de aanpassingen afzonderlijk worden berekend voor elke vertakking van de topologie.
Wanneer de presentatie overschakelt naar het volgende segment, wordt de klok van de presentatie niet gestopt of opnieuw ingesteld en neemt de presentatietijd monotonisch toe. Voordat een nieuw segment wordt gestart, verzendt de mediasessie de toepassing een MESessionNotifyPresentationTime gebeurtenis. De gebeurtenis geeft de begintijd van het segment, ten opzichte van de presentatieklok en de waarde van de offset op. Wanneer een nieuw segment wordt gestart, roept de pijplijn Start op de sequencer-bron aan met de waarde VT_EMPTY. De sequencer-bron verzendt een MESourceStarted gebeurtenis zonder begintijd.
Om te zoeken, geeft de toepassing een segment-id plus een tijdsverschil binnen het segment op. Na het zoeken begint de presentatieklok bij het segment verschuiving. Hier volgt een voorbeeld van hoe dat proces werkt:
- Voorbeeld 3: De toepassing probeert S3 te segmenteren, met een segmentverschil van 10 seconden. De presentatieklok begint bij 10 seconden (de segmentverschil). De offset omvat niet de duur van segmenten S1 en S2. De sequencer-bron verzendt een MESourceStarted-gebeurtenis met een begintijd die gelijk is aan de segment-offset, 10 seconden.
Als het afspelen na een zoekvak verdergaat met het volgende segment, werkt de overgang net als in de vorige voorbeelden, behalve dat de offset niet de overgeslagen segmenten bevat.
Hier volgen enkele verdere details die van invloed zijn op de wijze waarop voorbeelden tijdstempels krijgen:
- Decoders hebben mogelijk gegevens nodig buiten de mediastoptijd. De pijplijn haalt zoveel gegevens uit de bron op als de decoder nodig heeft en knipt vervolgens de uitvoervoorbeelden van de decoder af.
- Transformaties kunnen gegevens bufferen. Een audio-effect moet dit bijvoorbeeld doen. Wanneer een segment eindigt, is het tijdstempel op het laatste voorbeeld van de transformatie eerder dan het einde van het segment, omdat de transformatie bepaalde gegevens vasthoudt. Wanneer het volgende segment begint, is het tijdstempel op de eerste steekproef iets eerder dan het begin van het segment. Er is geen gat in de tijdstempels, dus de gegevens die de media-sink bereiken, zijn continu. Wanneer het laatste segment eindigt, wordt de transformatie door de pijplijn leeggeraakt, zodat er geen gegevens verloren gaan.
- De bron moet mogelijk iets eerder beginnen dan de begintijd van de media om het vorige sleutelframe op te halen. Daarom kan de eerste steekproef na de aanpassing een negatieve presentatietijd hebben.
Bewerkingsreeksen
In een bewerkingsreeks geeft de toepassing vooraf de segmentgrenzen op door de kenmerken MF_TOPOLOGY_PROJECTSTART en MF_TOPOLOGY_PROJECTSTOP in te stellen. De pijplijn berekent aanpassingen voor de tijdstempels op bijna dezelfde manier als voor een afspeellijstreeks:
Voor de offset wordt de waarde van MF_TOPOLOGY_PROJECTSTARTgebruikt in plaats van het waargenomen einde van het segment te gebruiken.
Voor het zoeken gebruikt de offset een waarde die gelijk is aan de MF_TOPOLOGY_PROJECTSTART waarde van het segment plus de segmentverschil.
Daarom is de presentatietijd in een bewerkingsreeks altijd relatief ten opzichte van het begin van de presentatie, zelfs als de toepassing naar een ander segment zoekt.
Verwante onderwerpen