Partager via


Positionnement dans les flux

AVIFile fournit plusieurs façons de localiser et de passer à une position dans un flux de données. Les fonctions et macros de cette section permettent à votre application de trouver la position de départ, la longueur et les images clés (contenant une image complète dans l’exemple) dans un flux. Les fonctions et les macros associent également le temps aux positions dans un flux en calculant le temps écoulé nécessaire pour lire un flux depuis son début jusqu’à n’importe quel point dans un flux.

Recherche de la position de départ

Vous pouvez récupérer le numéro d’exemple de la première image dans un flux vidéo à l’aide de la fonction AVIStreamStart . (Les images d’un film peuvent commencer à l’échantillon 0 ou 1, selon la préférence de l’auteur.) Vous pouvez également obtenir ces informations à l’aide de la fonction AVIStreamInfo . Cette fonction stocke le numéro d’exemple dans le membre dwStart de la structure AVISTREAMINFO . Vous pouvez récupérer l’heure de début du premier exemple d’un flux à l’aide de la macro AVIStreamStartTime .

Vous pouvez récupérer la longueur du flux à l’aide de la fonction AVIStreamLength . Cette fonction retourne le nombre d’échantillons dans le flux. Vous pouvez également obtenir ces informations à l’aide de la fonction AVIStreamInfo . Cette fonction stocke la longueur du flux dans le membre dwLength de la structure AVISTREAMINFO . Pour récupérer la longueur d’un flux en millisecondes, utilisez la macro AVIStreamLengthTime .

Dans un flux vidéo, chaque exemple correspond généralement à une image de vidéo. Toutefois, il peut y avoir des exemples pour lesquels aucune donnée vidéo n’est présente. Si vous appelez la fonction AVIStreamRead en spécifiant l’une de ces positions, elle retourne une longueur de données de 0 octet. Vous pouvez trouver des exemples qui contiennent des données à l’aide de la fonction AVIStreamFindSample et en spécifiant l’indicateur FIND_ANY.

Dans un flux audio, chaque exemple correspond à un bloc de données audio. Par exemple, si les données audio ont un format ADPCM (Adaptive Differential Pulse Code Modulation) de 22 kHz, chaque exemple pour AVIStreamLength correspond à un bloc de 256 octets de données audio compressées. Ce bloc de données audio contient environ 500 exemples audio lorsqu’ils ne sont pas compressés. Toutefois, les fonctions et les macros d’AVIFile traitent chaque bloc de 256 octets comme un seul exemple.

Notes

Positions valides dans une plage de flux du début à la fin du flux, qui correspond à la somme du point de départ du flux et de sa longueur. La position représentée par la somme de la position de départ et de la longueur correspond à une heure après le rendu des dernières données ; il ne contient aucune donnée. Vous pouvez récupérer l’exemple de numéro qui représente la fin du flux à l’aide de la macro AVIStreamEnd . Vous pouvez récupérer la valeur de temps en millisecondes qui représente la fin du flux à l’aide de la macro AVIStreamEndTime .

 

Recherche d’exemples et d’images clés

Vous pouvez rechercher différents types d’exemples dans un flux à l’aide de la fonction AVIStreamFindSample . Cette fonction recherche vers l’arrière ou vers l’avant dans un flux un échantillon du type approprié, en commençant par le numéro d’exemple que vous spécifiez. Vous pouvez rechercher différents types d’exemples dans un flux en spécifiant un indicateur dans la séquence d’appel AVIStreamFindSample . Spécifiez l’indicateur de FIND_ANY pour localiser les échantillons non vides ou pour ignorer les échantillons qui ne disposent pas de données. Spécifiez l’indicateur FIND_KEY pour rechercher les images clés qui contiennent les données pour afficher une image complète sans avoir à référencer les images précédentes. Spécifiez l’indicateur FIND_FORMAT pour rechercher les modifications apportées au format. AVIStreamFindSample est principalement utilisé avec les flux vidéo.

Plusieurs macros qui utilisent des fonctions AVIFile complètent les fonctionnalités de recherche de flux. La liste suivante fournit une brève description de chaque macro. Les macros qui recherchent une position ou un type de données spécifiques nécessitent qu’un emplacement de départ soit spécifié dans le flux.

Macro Description
AVIStreamIsKeyFrame Indique si un exemple dans un flux spécifié est une trame clé.
AVIStreamNearestKeyFrame Localise l’image clé à ou avant une position spécifiée dans un flux.
AVIStreamNearestKeyFrameTime Détermine l’heure correspondant au début de l’image clé la plus proche (à ou précédant) une heure spécifiée dans un flux.
AVIStreamNearestSample Localise l’échantillon non vide le plus proche à ou avant une position spécifiée dans un flux.
AVIStreamNearestSampleTime Détermine l’heure correspondant au début d’un échantillon le plus proche d’une heure spécifiée dans un flux.
AVIStreamNextKeyFrame Localise le cadre clé suivant une position spécifiée dans un flux.
AVIStreamNextKeyFrameTime Retourne l’heure de l’image clé suivante dans un flux, en commençant à une heure donnée.
AVIStreamNextSample Recherche l’échantillon non vide suivant à partir d’une position spécifiée dans un flux.
AVIStreamNextSampleTime Retourne l’heure à laquelle un exemple passe à l’exemple suivant dans le flux.
AVIStreamPrevKeyFrame Recherche la trame clé qui précède une position spécifiée dans un flux.
AVIStreamPrevKeyFrameTime Retourne l’heure de l’image clé précédente dans le flux, en commençant à un moment donné.
AVIStreamPrevSample Recherche l’exemple non vide qui précède une position spécifiée dans un flux.
AVIStreamPrevSampleTime Détermine l’heure à laquelle l’exemple précédent remplace son prédécesseur dans le flux.
AVIStreamSampleToSample Retourne l’exemple dans un flux qui se produit en même temps qu’un exemple qui se produit dans un deuxième flux.

 

Basculer entre les exemples et le temps

Vous pouvez déterminer le temps écoulé entre le début d’un flux et un exemple à l’aide de la fonction AVIStreamSampleToTime . Cette fonction convertit le nombre d’échantillons en une valeur de temps exprimée en millisecondes. Pour une image vidéo (qui s’étend sur plusieurs millisecondes), cette valeur représente la durée de lecture de l’exemple depuis le début de la lecture et suppose que le clip vidéo est lu à une vitesse normale. Pour un exemple audio (qui comporte plusieurs exemples en millisecondes), la valeur de temps correspond à l’heure à laquelle l’échantillon commence à être lu et suppose que le flux audio est lu à une vitesse normale.

À l’inverse, vous pouvez trouver l’exemple de numéro associé à une valeur de temps à l’aide de la fonction AVIStreamTimeToSample . Cette fonction convertit la valeur en millisecondes en nombre d’échantillons et suppose que le clip vidéo est lu à une vitesse normale.

Étant donné qu’AVIStreamSampleToTime renvoie l’heure à laquelle une image commence à être lue, la relation entre AVIStreamSampleToTime et AVIStreamTimeToSample n’est pas vraiment inverse. Ils déterminent la position dans un fichier plus acurately qu’ils ne déterminent l’heure. Par exemple, deux exemples audio consécutifs peuvent tous deux être lues dans la même milliseconde. L’utilisation d’AVIStreamSampleToTime pour convertir les exemples de nombres entraînerait des valeurs temporelles identiques. Si vous reconvertisez la valeur de temps en nombre d’exemples à l’aide d’AVIStreamTimeToSample, un seul exemple est référencé.