Tempi di presentazione sequenza
In questo argomento viene descritto come l'origine Sequencer gestisce i tempi di presentazione durante la riproduzione.
Panoramica
L'origine sequencer supporta due modalità diverse: sequenze di playlist e sequenze di modifica.
In una sequenza di modifica, l'applicazione specifica la durata di ogni segmento in anticipo, prima di avviare la riproduzione. In una sequenza di playlist, l'applicazione non specifica la durata in anticipo. (In effetti, la durata potrebbe non essere nota.
In entrambi i casi, è possibile specificare l'ora di inizio e arresto multimediale di un segmento. Queste volte specificano la posizione nel file di origine in cui inizia e termina il segmento. Si supponga, ad esempio, che il file di origine sia lungo 90 secondi. Se si desidera tagliare i primi 10 secondi e gli ultimi 10 secondi, specificare i valori seguenti:
- Avvio multimediale: 10 secondi
- Arresto multimediale: 80 secondi
Per specificare l'ora di inizio del supporto, impostare l'attributo MF_TOPONODE_MEDIASTART nel nodo di origine. Per specificare l'ora di arresto multimediale, impostare l'attributo MF_TOPONODE_MEDIASTOP nel nodo di origine.
Per creare una sequenza di modifica, impostare l'attributo MF_SESSION_GLOBAL_TIME quando si crea la sessione multimediale. In caso contrario, la sessione multimediale prevede sequenze di playlist. In una sequenza di modifica ogni topologia di segmento deve avere l'attributo MF_TOPOLOGY_PROJECTSTART e l'attributo MF_TOPOLOGY_PROJECTSTOP.
Sequenze di playlist
In una sequenza di playlist, l'orologio della presentazione inizia a zero e continua attraverso i limiti dei segmenti. Le origini native forniscono campioni con timestamp uguali al tempo multimediale. La pipeline converte i timestamp nell'ora di presentazione corretta come indicato di seguito:
- Nuovo timestamp = tempo multimediale + offset − inizio multimediale
Il valore di offset è l'ora di presentazione in cui è terminato il segmento precedente. Per il primo segmento, l'offset è zero. Ecco due esempi di come vengono calcolate queste conversioni timestamp:
- Esempio 1: si supponga che il primo segmento (S1) sia lungo 10 secondi e che il secondo segmento (S2) abbia un'ora di inizio multimediale pari a zero. L'origine nativa usa il tempo multimediale per i timestamp, quindi il primo campione di S2 ha un timestamp pari a zero. L'offset è di 10 secondi (la durata di S1), quindi il timestamp regolato è:0 + 10 − 0 = 10 secondi.
- Esempio 2: si supponga che il segmento S1 sia lungo 10 secondi e S2 abbia un'ora di inizio multimediale di 5 secondi. Il primo esempio di S2 ha un timestamp di 5 secondi (tempo multimediale). L'offset è di 10 secondi, quindi il timestamp regolato è:5 + 10 − 5 = 10 secondi.
Tutti i componenti della pipeline downstream dai nodi di origine ricevono campioni con i timestamp regolati. I nodi di origine in una topologia possono avere orari di inizio dei supporti diversi, quindi le regolazioni vengono calcolate separatamente per ogni ramo della topologia.
Quando la presentazione passa al segmento successivo, l'orologio della presentazione non si arresta o reimposta e il tempo di presentazione aumenta in modo monotonico. Prima dell'avvio di un nuovo segmento, la sessione multimediale invia all'applicazione un evento MESessionNotifyPresentationTime. L'evento specifica l'ora di inizio del segmento, rispetto all'orologio della presentazione e il valore dell'offset. All'avvio di un nuovo segmento, la pipeline chiama Start nell'origine sequencer con il valore VT_EMPTY. L'origine sequencer invia un evento MESourceStarted senza ora di inizio.
Per eseguire la ricerca, l'applicazione specifica un identificatore di segmento più un offset temporale all'interno del segmento. Dopo la ricerca, l'orologio della presentazione inizia in corrispondenza dell'offset segmento. Di seguito è riportato un esempio di funzionamento del processo:
- Esempio 3: l'applicazione cerca di segmentare S3, con un offset segmento di 10 secondi. L'orologio della presentazione inizia a 10 secondi (offset del segmento). L'offset non include la durata dei segmenti S1 e S2. L'origine sequencer invia un evento MESourceStarted con un'ora di inizio uguale all'offset del segmento, 10 secondi.
Dopo una ricerca, se la riproduzione continua al segmento successivo, la transizione funziona esattamente come negli esempi precedenti, ad eccezione del fatto che l'offset non include i segmenti ignorati.
Ecco alcuni dettagli aggiuntivi che influiscono sul timestamp degli esempi:
- I decodificatori potrebbero richiedere dati oltre il tempo di arresto multimediale. La pipeline esegue il pull della quantità di dati dall'origine richiesta dal decodificatore e quindi taglia gli esempi di output del decodificatore.
- Le trasformazioni potrebbero memorizzare nel buffer i dati. Ad esempio, un effetto audio potrebbe dover eseguire questa operazione. Quando termina un segmento, il timestamp dell'ultimo campione della trasformazione è precedente alla fine del segmento, perché la trasformazione mantiene alcuni dati. All'avvio del segmento successivo, il timestamp del primo campione è leggermente precedente all'inizio del segmento. Non esiste alcun divario nei timestamp, quindi i dati che raggiungono il sink multimediale sono continui. Al termine del segmento finale, la pipeline svuota la trasformazione, quindi non viene perso alcun dato.
- L'origine potrebbe dover iniziare leggermente prima dell'ora di inizio del supporto per recuperare il fotogramma chiave precedente. Pertanto, dopo la regolazione, il primo campione potrebbe avere un tempo di presentazione negativo.
Modifica di sequenze
In una sequenza di modifica, l'applicazione specifica in anticipo i limiti dei segmenti impostando gli attributi MF_TOPOLOGY_PROJECTSTART e MF_TOPOLOGY_PROJECTSTOP. La pipeline calcola le regolazioni per i timestamp quasi allo stesso modo di una sequenza di playlist:
Per l'offset, usa il valore di MF_TOPOLOGY_PROJECTSTART, invece di usare la fine osservata del segmento.
Per la ricerca, l'offset usa un valore uguale al valore MF_TOPOLOGY_PROJECTSTART del segmento più l'offset del segmento.
Pertanto, il tempo di presentazione in una sequenza di modifica è sempre relativo all'inizio della presentazione, anche se l'applicazione cerca un altro segmento.
Argomenti correlati