Timestamp

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture 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 i tempi di inizio e fine di un esempio 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 di filtro MPEG il timestamp non viene applicato a ogni frame finché 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 un 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 parser sono responsabili dell'impostazione dei timestamp corretti sugli esempi elaborati. Usare le linee guida seguenti.

  • Riproduzione file: il primo esempio viene contrassegnato con un'ora di inizio pari a zero. I timestamp successivi sono determinati dalla lunghezza dell'esempio 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 video e audio: ogni esempio viene contrassegnato con un'ora di inizio uguale all'ora di inizio in cui è stata acquisita, con gli avvisi 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 frame video stampato con il tempo di acquisizione arriverà sempre in ritardo nel renderer video. Ciò può causare l'eliminazione dei fotogrammi del renderer, in un tentativo di controllo della qualità. Per informazioni sul controllo qualità, vedere Gestione controllo qualità.
    • Acquisizione audio: il filtro di acquisizione audio usa il proprio set di buffer, 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 è più di 10 millisecondi. I timestamp degli esempi audio riflettono il tempo in cui il driver ha riempito i buffer del filtro di acquisizione audio. Questi tempi possono essere leggermente imprecisi, soprattutto se l'applicazione usa una dimensione del buffer molto piccola. Tuttavia, i tempi multimediali riflettono in modo accurato i campioni audio del numero nel buffer.
  • Filtri Mux: a seconda del formato di output, un filtro mux potrebbe dover generare timestamp o potrebbe non essere possibile. Ad esempio, il formato di file AVI usa una frequenza di fotogrammi fissa senza timestamp, quindi il filtro AVI Mux presuppone che gli esempi arrivino approssimativamente al momento giusto. Se i timestamp in ingresso mostrano un gap maggiore di un fotogramma, tuttavia, AVI Mux scrive una voce di indice con dimensione zero, per indicare un frame eliminato. Nella riproduzione dei file vengono generati nuovi timestamp in fase di esecuzione, come descritto in precedenza.

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

Tempi multimediali

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 esempio 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 tempo di arresto multimediale pari a 44100. In un flusso ricercabile, il tempo multimediale è sempre relativo all'ora di inizio del flusso. Si supponga, ad esempio, di cercare 2 secondi dall'inizio di un flusso video a 15 fps. Il primo esempio multimediale dopo la ricerca ha un timestamp pari a zero, ma un tempo multimediale pari a 30.

I filtri renderer e mux possono usare il tempo multimediale per determinare se i fotogrammi o gli esempi 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