Carimbos de Data/Hora

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

O carimbo de data/hora define os tempos de início e término de uma amostra de mídia, medidos em tempo de fluxo. Às vezes, o carimbo de data/hora é chamado de hora da apresentação. Ao ler o restante deste artigo, é importante lembrar que nem todos os formatos usam carimbos de data/hora da mesma maneira. Por exemplo, nem todos os exemplos de MPEG têm carimbo de data/hora. Em grafos de filtro MPEG, o carimbo de data/hora não é aplicado a cada quadro até que sejam gerados do decodificador.

Quando um filtro de renderizador recebe um exemplo, ele agenda a renderização com base no carimbo de data/hora. Se o exemplo chegar atrasado ou não tiver um carimbo de data/hora, o filtro renderizará o exemplo imediatamente. Caso contrário, o filtro aguardará até a hora de início do exemplo antes de renderizar o exemplo. (Ele aguarda a hora de início chamando o método IReferenceClock::AdviseTime .)

Filtros de origem e filtros de analisador são responsáveis por definir os carimbos de data/hora corretos nos exemplos que processam. Use as diretrizes a seguir.

  • Reprodução de arquivo: o primeiro exemplo é o carimbo de data/hora com uma hora de início igual a zero. Os carimbos de data/hora subsequentes são determinados pelo comprimento da amostra e pela taxa de reprodução, que por si só é determinada pelo formato de arquivo. O filtro que analisa o arquivo é responsável por calcular os carimbos de data/hora corretos (por exemplo, o Divisor de AVI).
  • Captura de áudio e vídeo: cada amostra é carimbada com uma hora de início igual à hora de transmissão quando foi capturada, com as seguintes advertências:
    • Os quadros de vídeo de um pino de visualização (em vez de um pino de captura) não têm carimbo de data/hora. Devido à latência do grafo, um quadro de vídeo que é carimbado com o tempo de captura sempre chegará atrasado ao renderizador de vídeo. Isso pode fazer com que o renderizador solte quadros, em uma tentativa de controle de qualidade. Para obter informações sobre o controle de qualidade, consulte Gerenciamento de controle de qualidade.
    • Captura de áudio: o filtro de captura de áudio usa seu próprio conjunto de buffers, que são separados daqueles usados pelo driver de áudio. O driver de áudio preenche os buffers do filtro de captura em intervalos fixos. O intervalo depende do driver, mas geralmente não é superior a 10 milissegundos. Os carimbos de data/hora nos exemplos de áudio refletem a hora em que o driver preencheu os buffers do filtro de captura de áudio. Esses tempos podem ser um pouco imprecisos, especialmente se o aplicativo estiver usando um tamanho de buffer muito pequeno. No entanto, os tempos de mídia refletirão com precisão o número de amostras de áudio no buffer.
  • Filtros Mux: dependendo do formato de saída, um filtro mux pode precisar gerar carimbos de data/hora ou talvez não. Por exemplo, o formato de arquivo AVI usa uma taxa de quadros fixa sem carimbos de data/hora, portanto, o filtro AVI Mux pressupõe que os exemplos estão chegando aproximadamente na hora certa. No entanto, se os carimbos de data/hora de entrada mostrarem uma lacuna maior que um quadro, o AVI Mux gravará uma entrada de índice com tamanho zero para indicar um quadro descartado. Na reprodução de arquivo, novos carimbos de data/hora são gerados em tempo de execução, conforme descrito anteriormente.

Para definir o carimbo de data/hora em um exemplo, chame o método IMediaSample::SetTime .

Media Times

Opcionalmente, o filtro também pode especificar um tempo de mídia para o exemplo. Em um fluxo de vídeo, o tempo de mídia representa o número do quadro. Em um fluxo de áudio, o tempo de mídia representa o número de exemplo no pacote. Por exemplo, se cada pacote contiver um segundo de áudio de 44,1 quilohertz (kHz), o primeiro pacote terá uma hora de início de mídia igual a zero e uma hora de parada de mídia de 44100. Em um fluxo que pode ser buscado, o tempo de mídia é sempre relativo à hora de início do fluxo. Por exemplo, suponha que você busque até 2 segundos a partir do início de um fluxo de vídeo de 15 fps. O primeiro exemplo de mídia após a busca tem um carimbo de data/hora zero, mas um tempo de mídia de 30.

Os filtros de renderizador e mux podem usar o tempo de mídia para determinar se os quadros ou amostras foram descartados, verificando se há lacunas. No entanto, os filtros não são necessários para definir o tempo de mídia. Para definir o tempo de mídia em um exemplo, chame o método IMediaSample::SetMediaTime .

Hora e relógios no DirectShow