Condividi tramite


Posizionamento in flussi

AVIFile offre diversi modi per individuare e spostare in una posizione in un flusso di dati. Le funzioni e le macro in questa sezione consentono all'applicazione di trovare la posizione iniziale, la lunghezza e i fotogrammi chiave (contenenti un'immagine completa nell'esempio) all'interno di un flusso. Le funzioni e le macro associano anche il tempo alle posizioni in un flusso calcolando il tempo trascorso necessario per riprodurre un flusso dall'inizio a qualsiasi punto in un flusso.

Ricerca della posizione iniziale

È possibile recuperare il numero di esempio del primo frame in un flusso video usando la funzione AVIStreamStart . I fotogrammi di un film potrebbero iniziare a esempio 0 o 1, a seconda della preferenza dell'autore. È anche possibile ottenere queste informazioni usando la funzione AVIStreamInfo . Questa funzione archivia il numero di esempio nel membro dwStart della struttura AVISTREAMINFO . È possibile recuperare l'ora iniziale del primo esempio di un flusso usando la macro AVIStreamStartTime .

È possibile recuperare la lunghezza del flusso usando la funzione AVIStreamLength . Questa funzione restituisce il numero di esempi nel flusso. È anche possibile ottenere queste informazioni usando la funzione AVIStreamInfo . Questa funzione archivia la lunghezza del flusso nel membro dwLength della struttura AVISTREAMINFO . Per recuperare la lunghezza di un flusso in millisecondi, usare la macro AVIStreamLengthTime .

In un flusso video ogni esempio corrisponde in genere a un frame di video. Potrebbero tuttavia essere presenti esempi per i quali non sono presenti dati video. Se si chiama la funzione AVIStreamRead che specifica una di queste posizioni, restituisce una lunghezza di dati di 0 byte. È possibile trovare esempi che contengono dati usando la funzione AVIStreamFindSample e specificando il flag di FIND_ANY.

In un flusso audio ogni esempio corrisponde a un blocco di dati di dati audio. Ad esempio, se i dati audio hanno un formato ADPCM a 22 kHz (modularità del codice di impulsi differenziali adattivi), ogni esempio per AVIStreamLength corrisponde a un blocco di 256 byte di dati audio compressi. Questo blocco di dati audio contiene circa 500 esempi audio quando non è compresso. Le funzioni e le macro di AVIFile, tuttavia, considerano ogni blocco a 256 byte come singolo esempio.

Nota

Posizioni valide all'interno di un intervallo di flusso dall'inizio alla fine del flusso, ovvero la somma del punto iniziale del flusso e la relativa lunghezza. La posizione rappresentata dalla somma della posizione iniziale e la lunghezza corrisponde a un'ora dopo il rendering degli ultimi dati; non contiene dati. È possibile recuperare il numero di esempio che rappresenta la fine del flusso usando la macro AVIStreamEnd . È possibile recuperare il valore di tempo in millisecondi che rappresenta la fine del flusso usando la macro AVIStreamEndTime .

 

Ricerca di fotogrammi di esempio e chiave

È possibile cercare diversi tipi di esempi in un flusso usando la funzione AVIStreamFindSample . Questa funzione esegue ricerche indietro o avanti tramite un flusso per un esempio del tipo appropriato, a partire dal numero di esempio specificato. È possibile cercare diversi tipi di esempi in un flusso specificando un flag nella sequenza di chiamata AVIStreamFindSample . Specificare il flag di FIND_ANY per individuare esempi non interrotti o ignorare esempi che non contengono dati. Specificare il flag FIND_KEY per cercare fotogrammi chiave che contengono i dati per eseguire il rendering di un'immagine completa senza dover fare riferimento ai fotogrammi precedenti. Specificare il flag FIND_FORMAT per cercare modifiche al formato. AVIStreamFindSample viene usato principalmente con flussi video.

Diverse macro che usano funzioni AVIFile integrano le funzionalità di ricerca del flusso. L'elenco seguente fornisce una breve descrizione di ogni macro. Le macro che cercano una posizione o un tipo di dati specifici richiedono la posizione iniziale da specificare nel flusso.

Macro Descrizione
AVIStreamIsKeyFrame Indica se un esempio in un flusso specificato è un frame chiave.
AVIStreamNearestKeyFrame Individua il fotogramma chiave in corrispondenza o in precedenza di una posizione specificata in un flusso.
AVIStreamNearestKeyFrameTime Determina l'ora corrispondente all'inizio del fotogramma chiave più vicino (in o precedente) un'ora specificata in un flusso.
AVIStreamNearestSample Individua l'esempio non più vicino in corrispondenza o precedente a una posizione specificata in un flusso.
AVIStreamNearestSampleTime Determina l'ora corrispondente all'inizio di un esempio più vicino a un'ora specificata in un flusso.
AVIStreamNextKeyFrame Individua il fotogramma chiave successivo seguendo una posizione specificata in un flusso.
AVIStreamNextKeyFrameTime Restituisce l'ora del fotogramma chiave successivo in un flusso, a partire da un determinato momento.
AVIStreamNextSample Individua l'esempio non dispendioso successivo da una posizione specificata in un flusso.
AVIStreamNextSampleTime Restituisce il momento in cui un esempio viene modificato nell'esempio successivo nel flusso.
AVIStreamPrevKeyFrame Individua il fotogramma chiave che precede una posizione specificata in un flusso.
AVIStreamPrevKeyFrameTime Restituisce l'ora del frame di chiave precedente nel flusso, a partire da un determinato momento.
AVIStreamPrevSample Individua l'esempio non dispendioso che precede una posizione specificata in un flusso.
AVIStreamPrevSampleTime Determina il momento in cui l'esempio precedente sostituisce il predecessore nel flusso.
AVIStreamSampleToSample Restituisce l'esempio in un flusso che si verifica contemporaneamente a un esempio che si verifica in un secondo flusso.

 

Passaggio tra esempi e ora

È possibile determinare il tempo trascorso dall'inizio di un flusso a un esempio usando la funzione AVIStreamSampleToTime . Questa funzione converte il numero di esempio in un valore di tempo espresso in millisecondi. Per un fotogramma video (che si estende su diversi millisecondi), questo valore rappresenta il momento in cui l'esempio inizia a riprodurre dopo l'inizio della riproduzione e presuppone che il clip video viene riprodotto in velocità normale. Per un esempio audio (che include diversi campioni in millisecondi), il valore di tempo corrisponde al momento in cui l'esempio inizia a riprodurre e presuppone che il flusso audio viene riprodotto in velocità normale.

Al contrario, è possibile trovare il numero di esempio associato a un valore di tempo usando la funzione AVIStreamTimeToSample . Questa funzione converte il valore millisecondo in un numero di esempio e presuppone che il clip video funzioni con velocità normale.

Poiché AVIStreamSampleToTime restituisce l'ora in cui un frame inizia a riprodurre, la relazione tra AVIStreamSampleToTime e AVIStreamTimeToSample non è veramente inversa. Determinano la posizione in un file in modo più acurato rispetto a quello che determinano il tempo. Ad esempio, due esempi audio consecutivi possono essere riprodotti nello stesso millisecondo. L'uso di AVIStreamSampleToTime per convertire i numeri di esempio comporta valori temporali identici. Se si converte il valore di tempo in un numero di esempio usando AVIStreamTimeToSample, viene fatto riferimento a un singolo esempio.