Posicionamiento en secuencias
AVIFile proporciona varias maneras de localizar y mover a una posición en un flujo de datos. Las funciones y macros de esta sección permiten a la aplicación encontrar la posición inicial, la longitud y los fotogramas clave (que contienen una imagen completa en el ejemplo) dentro de una secuencia. Las funciones y macros también asocian el tiempo con las posiciones de un flujo calculando el tiempo transcurrido necesario para reproducir una secuencia desde su principio hasta cualquier punto de una secuencia.
Búsqueda de la posición inicial
Puede recuperar el número de ejemplo del primer fotograma de una secuencia de vídeo mediante la función AVIStreamStart . (Los fotogramas de una película pueden comenzar en la muestra 0 o 1, dependiendo de la preferencia del autor). También puede obtener esta información mediante la función AVIStreamInfo . Esta función almacena el número de ejemplo en el miembro dwStart de la estructura AVISTREAMINFO . Puede recuperar la hora de inicio del primer ejemplo de una secuencia mediante la macro AVIStreamStartTime .
Puede recuperar la longitud de la secuencia mediante la función AVIStreamLength . Esta función devuelve el número de muestras de la secuencia. También puede obtener esta información mediante la función AVIStreamInfo . Esta función almacena la longitud de la secuencia en el miembro dwLength de la estructura AVISTREAMINFO . Para recuperar la longitud de una secuencia en milisegundos, use la macro AVIStreamLengthTime .
En una secuencia de vídeo, cada ejemplo suele corresponder a un fotograma de vídeo. Sin embargo, podría haber ejemplos para los que no hay datos de vídeo presentes. Si llama a la función AVIStreamRead que especifica una de esas posiciones, devuelve una longitud de datos de 0 bytes. Puede encontrar ejemplos que contienen datos mediante la función AVIStreamFindSample y especificando la marca FIND_ANY.
En una secuencia de audio, cada muestra corresponde a un bloque de datos de datos de audio. Por ejemplo, si los datos de audio tienen un formato ADPCM de 22 kHz (modulación de código de pulso diferencial adaptable), cada muestra para AVIStreamLength corresponde a un bloque de 256 bytes de datos de audio comprimidos. Este bloque de datos de audio contiene aproximadamente 500 muestras de audio cuando se descomprimen. Sin embargo, las funciones y macros de AVIFile tratan cada bloque de 256 bytes como ejemplo único.
Nota
Posiciones válidas dentro de un intervalo de flujo desde el principio hasta el final de la secuencia, que es la suma del punto inicial de la secuencia y su longitud. Posición representada por la suma de la posición inicial y la longitud corresponde a un tiempo después de que se hayan representado los últimos datos; no contiene ningún dato. Puede recuperar el número de ejemplo que representa el final de la secuencia mediante la macro AVIStreamEnd . Puede recuperar el valor de hora en milisegundos que representa el final de la secuencia mediante la macro AVIStreamEndTime .
Buscar fotogramas clave y de ejemplo
Puede buscar diferentes tipos de ejemplos en una secuencia mediante la función AVIStreamFindSample . Esta función busca hacia atrás o hacia delante a través de una secuencia un ejemplo del tipo adecuado, empezando por el número de ejemplo que especifique. Puede buscar diferentes tipos de ejemplos en una secuencia especificando una marca en la secuencia de llamadas AVIStreamFindSample . Especifique la marca FIND_ANY para buscar ejemplos no vacíos o omitir muestras que carecen de datos. Especifique la marca FIND_KEY para buscar fotogramas clave que contengan los datos para representar una imagen completa sin necesidad de hacer referencia a fotogramas anteriores. Especifique la marca FIND_FORMAT para buscar cambios en el formato. AVIStreamFindSample se usa principalmente con secuencias de vídeo.
Varias macros que usan funciones AVIFile complementan las características de búsqueda de secuencias. En la lista siguiente se proporciona una breve descripción de cada macro. Las macros que buscan una posición o tipo de datos específicos requieren que se especifique una ubicación inicial en la secuencia.
Macro | Descripción |
---|---|
AVIStreamIsKeyFrame | Indica si un ejemplo de una secuencia especificada es un fotograma clave. |
AVIStreamNearestKeyFrame | Busca el fotograma clave en o antes de una posición especificada en una secuencia. |
AVIStreamNearestKeyFrameTime | Determina la hora correspondiente al principio del fotograma clave más cercano (en o anterior) una hora especificada en una secuencia. |
AVIStreamNearestSample | Busca la muestra no vacía más cercana en o antes de una posición especificada en una secuencia. |
AVIStreamNearestSampleTime | Determina la hora correspondiente al principio de una muestra más cercana a una hora especificada en una secuencia. |
AVIStreamNextKeyFrame | Busca el siguiente fotograma clave después de una posición especificada en una secuencia. |
AVIStreamNextKeyFrameTime | Devuelve la hora del siguiente fotograma clave de una secuencia, comenzando en un momento dado. |
AVIStreamNextSample | Busca la siguiente muestra no vacía de una posición especificada en una secuencia. |
AVIStreamNextSampleTime | Devuelve la hora en que un ejemplo cambia al siguiente ejemplo de la secuencia. |
AVIStreamPrevKeyFrame | Busca el fotograma clave que precede a una posición especificada en una secuencia. |
AVIStreamPrevKeyFrameTime | Devuelve la hora del fotograma clave anterior en la secuencia, comenzando en un momento determinado. |
AVIStreamPrevSample | Busca la muestra no vacía que precede a una posición especificada en una secuencia. |
AVIStreamPrevSampleTime | Determina la hora en la que el ejemplo anterior reemplaza a su predecesor en la secuencia. |
AVIStreamSampleToSample | Devuelve el ejemplo en una secuencia que se produce al mismo tiempo que una muestra que se produce en una segunda secuencia. |
Cambiar entre muestras y hora
Puede determinar el tiempo transcurrido desde el principio de una secuencia a un ejemplo mediante la función AVIStreamSampleToTime . Esta función convierte el número de ejemplo en un valor de tiempo expresado en milisegundos. Para un fotograma de vídeo (que abarca varios milisegundos), este valor representa el momento en que la muestra comienza a reproducirse desde que se inició la reproducción y asume que el clip de vídeo se reproduce a velocidad normal. Para una muestra de audio (que tiene varias muestras en un milisegundo), el valor de hora corresponde a la hora en la que la muestra comienza a reproducirse y asume que la secuencia de audio se reproduce a velocidad normal.
Por el contrario, puede encontrar el número de ejemplo asociado a un valor de hora mediante la función AVIStreamTimeToSample . Esta función convierte el valor de milisegundos en un número de ejemplo y supone que el clip de vídeo se reproduce a velocidad normal.
Dado que AVIStreamSampleToTime devuelve la hora en la que comienza a reproducirse un fotograma, la relación entre AVIStreamSampleToTime y AVIStreamTimeToSample no es realmente inversa. Determinan la posición en un archivo más acurately de lo que determinan el tiempo. Por ejemplo, dos muestras de audio consecutivas pueden reproducirse en el mismo milisegundo. El uso de AVIStreamSampleToTime para convertir los números de ejemplo daría como resultado valores de hora idénticos. Si convierte el valor de tiempo en un número de ejemplo mediante AVIStreamTimeToSample, se hará referencia a una sola muestra.