Condividi tramite


Timestamp

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il timestamp definisce gli orari di inizio e fine di un campione multimediale, misurati in tempo di flusso. Il timestamp viene talvolta chiamato ora di presentazione . Quando si legge il resto di questo articolo, è importante ricordare che non tutti i formati usano i timestamp nello stesso modo. Ad esempio, non tutti gli esempi MPEG vengono contrassegnati come timestamp. Nei grafici dei filtri MPEG, il timestamp non viene applicato a ogni fotogramma fino a quando non vengono restituiti dal decodificatore.

Quando un filtro renderer riceve un esempio, pianifica il rendering in base al timestamp. Se l'esempio arriva in ritardo o non ha timestamp, il filtro esegue immediatamente il rendering dell'esempio. In caso contrario, il filtro attende fino all'ora di inizio dell'esempio prima di eseguire il rendering dell'esempio. Attende l'ora di inizio chiamando il metodo IReferenceClock::AdviseTime.

I filtri di origine e i filtri del parser sono responsabili dell'impostazione dei timestamp corretti negli esempi elaborati. Usare le linee guida seguenti.

  • Riproduzione di file: il primo esempio viene timestampato con un'ora di inizio pari a zero. I timestamp successivi sono determinati dalla lunghezza del campione e dalla frequenza di riproduzione, determinata dal formato di file. Il filtro che analizza il file è responsabile del calcolo dei timestamp corretti ( ad esempio, AVI Splitter).
  • Acquisizione di video e audio: ogni campione viene timestampato con un'ora di inizio uguale all'ora del flusso in cui è stata acquisita, con le avvertenze seguenti:
    • I fotogrammi video da un pin di anteprima (anziché un pin di acquisizione) non vengono contrassegnati come timestamp. A causa della latenza del grafico, un fotogramma video stampato con il tempo di acquisizione arriverà sempre in ritardo al renderer video. Ciò può causare il rilascio dei fotogrammi da parte del renderer, in un tentativo di controllo della qualità. Per informazioni sul controllo qualità, vedere Quality-Control Management.
    • Acquisizione audio: il filtro di acquisizione audio usa il proprio set di buffer, che sono separati da quelli usati dal driver audio. Il driver audio riempie i buffer del filtro di acquisizione a intervalli fissi. L'intervallo dipende dal driver, ma in genere non è superiore a 10 millisecondi. I timestamp negli esempi audio riflettono l'ora in cui il driver ha riempito i buffer del filtro di acquisizione audio. Queste volte possono essere leggermente imprecise, soprattutto se l'applicazione usa dimensioni del buffer molto ridotte. Tuttavia, i tempi multimediali rifletteranno accuratamente i campioni audio numerici nel buffer.
  • Filtri Mux: a seconda del formato di output, potrebbe essere necessario un filtro mux per generare timestamp o meno. Ad esempio, il formato di file AVI usa una frequenza dei fotogrammi fissa senza timestamp, quindi il filtro MUX AVI presuppone che i campioni arrivino approssimativamente al momento giusto. Se i timestamp in ingresso mostrano una distanza maggiore di un fotogramma, tuttavia, AVI Mux scrive una voce di indice con dimensioni zero, per indicare un fotogramma eliminato. Nella riproduzione dei file i nuovi timestamp vengono generati in fase di esecuzione, come descritto in precedenza.

Per impostare il timestamp in un esempio, chiamare il metodo IMediaSample::SetTime.

Media Times

Facoltativamente, il filtro può anche specificare un tempo multimediale per l'esempio. In un flusso video il tempo multimediale rappresenta il numero di fotogrammi. In un flusso audio, il tempo multimediale rappresenta il numero di campione nel pacchetto. Ad esempio, se ogni pacchetto contiene un secondo di 44,1 kilohertz (kHz), il primo pacchetto ha un'ora di inizio multimediale pari a zero e un'ora di arresto multimediale pari a 44100. In un flusso ricercabile, l'ora multimediale è sempre relativa all'ora di inizio del flusso. Si supponga, ad esempio, di cercare 2 secondi dall'inizio di un flusso video da 15 fps. Il primo campione multimediale dopo la ricerca ha un timestamp pari a zero, ma un tempo multimediale di 30.

I filtri renderer e mux possono usare il tempo multimediale per determinare se i fotogrammi o i campioni sono stati eliminati, controllando le lacune. Tuttavia, i filtri non sono necessari per impostare il tempo multimediale. Per impostare il tempo multimediale in un esempio, chiamare il metodo IMediaSample::SetMediaTime.

ora e orologi in DirectShow