Posicionamento em fluxos
O AVIFile fornece várias maneiras de localizar e mover para uma posição em um fluxo de dados. As funções e macros nesta seção permitem que seu aplicativo localize a posição inicial, o comprimento e os quadros-chave (contendo uma imagem completa no exemplo) em um fluxo. As funções e macros também associam o tempo a posições em um fluxo calculando o tempo decorrido necessário para reproduzir um fluxo desde o início até qualquer ponto em um fluxo.
Localizando a posição inicial
Você pode recuperar o número de exemplo do primeiro quadro em um fluxo de vídeo usando a função AVIStreamStart . (Os quadros de um filme podem começar na amostra 0 ou 1, dependendo da preferência do autor.) Você também pode obter essas informações usando a função AVIStreamInfo . Essa função armazena o número de exemplo no membro dwStart da estrutura AVISTREAMINFO . Você pode recuperar a hora de início do primeiro exemplo de um fluxo usando a macro AVIStreamStartTime .
Você pode recuperar o comprimento do fluxo usando a função AVIStreamLength . Essa função retorna o número de amostras no fluxo. Você também pode obter essas informações usando a função AVIStreamInfo . Essa função armazena o comprimento do fluxo no membro dwLength da estrutura AVISTREAMINFO . Para recuperar o comprimento de um fluxo em milissegundos, use a macro AVIStreamLengthTime .
Em um fluxo de vídeo, cada exemplo geralmente corresponde a um quadro de vídeo. No entanto, pode haver exemplos para os quais nenhum dado de vídeo está presente. Se você chamar a função AVIStreamRead especificando uma dessas posições, ela retornará um comprimento de dados de 0 bytes. Você pode encontrar exemplos que contêm dados usando a função AVIStreamFindSample e especificando o sinalizador FIND_ANY.
Em um fluxo de áudio, cada exemplo corresponde a um bloco de dados de dados de áudio. Por exemplo, se os dados de áudio tiverem um formato ADPCM de 22 kHz (Modulação de Código de Pulso Diferencial Adaptável), cada amostra para AVIStreamLength corresponderá a um bloco de 256 bytes de dados de áudio compactados. Esse bloco de dados de áudio contém aproximadamente 500 amostras de áudio quando descompactado. No entanto, as funções e macros do AVIFile tratam cada bloco de 256 bytes como uma única amostra.
Observação
Posições válidas dentro de um intervalo de fluxo do início ao final do fluxo, que é a soma do ponto de partida do fluxo e seu comprimento. A posição representada pela soma da posição inicial e o comprimento corresponde a um tempo após a renderização dos últimos dados; ele não contém nenhum dado. Você pode recuperar o número de exemplo que representa o final do fluxo usando a macro AVIStreamEnd . Você pode recuperar o valor de tempo em milissegundos que representa o final do fluxo usando a macro AVIStreamEndTime .
Localizando exemplos e quadros-chave
Você pode pesquisar diferentes tipos de exemplos em um fluxo usando a função AVIStreamFindSample . Essa função pesquisa para trás ou para frente por meio de um fluxo para obter uma amostra do tipo apropriado, começando com o número de exemplo especificado. Você pode pesquisar diferentes tipos de exemplos em um fluxo especificando um sinalizador na sequência de chamadas AVIStreamFindSample . Especifique o sinalizador FIND_ANY para localizar amostras não vazias ou ignorar amostras que não têm dados. Especifique o sinalizador FIND_KEY para pesquisar quadros-chave que contenham os dados para renderizar uma imagem completa sem a necessidade de referenciar quadros anteriores. Especifique o sinalizador FIND_FORMAT para pesquisar alterações no formato. AVIStreamFindSample é usado principalmente com fluxos de vídeo.
Várias macros que usam funções AVIFile complementam os recursos de pesquisa de fluxo. A lista a seguir fornece uma breve descrição de cada macro. As macros que pesquisam uma posição específica ou tipo de dados exigem que um local inicial seja especificado no fluxo.
Macro | Descrição |
---|---|
AVIStreamIsKeyFrame | Indica se um exemplo em um fluxo especificado é um quadro-chave. |
AVIStreamNearestKeyFrame | Localiza o quadro-chave em ou precedendo uma posição especificada em um fluxo. |
AVIStreamNearestKeyFrameTime | Determina o tempo correspondente ao início do quadro-chave mais próximo (em ou antes) de um horário especificado em um fluxo. |
AVIStreamNearestSample | Localiza a amostra não vazia mais próxima em ou antes de uma posição especificada em um fluxo. |
AVIStreamNearestSampleTime | Determina o tempo correspondente ao início de um exemplo mais próximo de uma hora especificada em um fluxo. |
AVIStreamNextKeyFrame | Localiza o próximo quadro-chave após uma posição especificada em um fluxo. |
AVIStreamNextKeyFrameTime | Retorna a hora do próximo quadro-chave em um fluxo, começando em um determinado momento. |
AVIStreamNextSample | Localiza o próximo exemplo não vazio de uma posição especificada em um fluxo. |
AVIStreamNextSampleTime | Retorna a hora em que um exemplo é alterado para o próximo exemplo no fluxo. |
AVIStreamPrevKeyFrame | Localiza o quadro-chave que precede uma posição especificada em um fluxo. |
AVIStreamPrevKeyFrameTime | Retorna a hora do quadro-chave anterior no fluxo, começando em um determinado momento. |
AVIStreamPrevSample | Localiza o exemplo não vazio que precede uma posição especificada em um fluxo. |
AVIStreamPrevSampleTime | Determina a hora em que o exemplo anterior substitui seu antecessor no fluxo. |
AVIStreamSampleToSample | Retorna o exemplo em um fluxo que ocorre ao mesmo tempo que um exemplo que ocorre em um segundo fluxo. |
Alternando entre amostras e tempo
Você pode determinar o tempo decorrido desde o início de um fluxo até um exemplo usando a função AVIStreamSampleToTime . Essa função converte o número de exemplo em um valor de tempo expresso em milissegundos. Para um quadro de vídeo (que abrange vários milissegundos), esse valor representa a hora em que o exemplo começa a ser reproduzido desde o início da reprodução e pressupõe que o clipe de vídeo seja reproduzido em velocidade normal. Para um exemplo de áudio (que tem vários exemplos em milissegundos), o valor de tempo corresponde à hora em que o exemplo começa a ser reproduzido e pressupõe que o fluxo de áudio seja reproduzido em velocidade normal.
Por outro lado, você pode encontrar o número de exemplo associado a um valor de tempo usando a função AVIStreamTimeToSample . Essa função converte o valor de milissegundos em um número de exemplo e pressupõe que o clipe de vídeo seja reproduzido em velocidade normal.
Como AVIStreamSampleToTime retorna a hora em que um quadro começa a ser reproduzido, a relação entre AVIStreamSampleToTime e AVIStreamTimeToSample não é verdadeiramente inversa. Eles determinam a posição em um arquivo mais acurately do que determinam o tempo. Por exemplo, dois exemplos de áudio consecutivos podem ser reproduzidos no mesmo milissegundo. Usar AVIStreamSampleToTime para converter os números de exemplo resultaria em valores de tempo idênticos. Se você converter o valor de tempo novamente em um número de exemplo usando AVIStreamTimeToSample, uma única amostra será referenciada.