Marcas de tiempo

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

La marca de tiempo define las horas de inicio y finalización de un ejemplo multimedia, medida en tiempo de secuencia. A veces, la marca de tiempo se denomina tiempo de presentación. Al leer el resto de este artículo, es importante recordar que no todos los formatos usan marcas de tiempo de la misma manera. Por ejemplo, no todas las muestras MPEG tienen marca de tiempo. En los gráficos de filtros MPEG, la marca de tiempo no se aplica a cada fotograma hasta que se generan desde el descodificador.

Cuando un filtro de representador recibe un ejemplo, programa la representación en función de la marca de tiempo. Si la muestra llega tarde o no tiene marca de tiempo, el filtro representa la muestra inmediatamente. De lo contrario, el filtro espera hasta la hora de inicio del ejemplo antes de representar el ejemplo. (Espera la hora de inicio llamando al método IReferenceClock::AdviseTime ).

Los filtros de origen y los filtros del analizador son responsables de establecer las marcas de tiempo correctas en los ejemplos que procesan. Use las instrucciones siguientes.

  • Reproducción de archivos: el primer ejemplo tiene una marca de tiempo con una hora de inicio de cero. Las marcas de tiempo posteriores se determinan por la longitud de la muestra y la velocidad de reproducción, determinada por el formato de archivo. El filtro que analiza el archivo es responsable de calcular las marcas de tiempo correctas (por ejemplo, el divisor AVI).
  • Captura de vídeo y audio: cada muestra tiene una marca de tiempo con una hora de inicio igual a la hora de la secuencia en la que se capturó, con las siguientes advertencias:
    • Los fotogramas de vídeo de un pin de vista previa (en lugar de un pin de captura) no tienen marca de tiempo. Debido a la latencia del gráfico, un fotograma de vídeo que se marca con el tiempo de captura siempre llegará tarde al representador de vídeo. Esto puede hacer que el representador quite fotogramas, en un intento de control de calidad. Para obtener información sobre el control de calidad, consulte Quality-Control Management.
    • Captura de audio: el filtro de captura de audio usa su propio conjunto de búferes, que son independientes de los usados por el controlador de audio. El controlador de audio rellena los búferes del filtro de captura a intervalos fijos. El intervalo depende del controlador, pero generalmente no es superior a 10 milisegundos. Las marcas de tiempo de las muestras de audio reflejan la hora en que el controlador llenó los búferes del filtro de captura de audio. Estas veces pueden ser ligeramente inexactas, especialmente si la aplicación usa un tamaño de búfer muy pequeño. Sin embargo, los tiempos multimedia reflejarán con precisión el número de muestras de audio en el búfer.
  • Filtros mux: dependiendo del formato de salida, es posible que un filtro mux necesite generar marcas de tiempo o no. Por ejemplo, el formato de archivo AVI usa una velocidad de fotogramas fija sin marcas de tiempo, por lo que el filtro AVI Mux supone que las muestras llegan aproximadamente al momento adecuado. Sin embargo, si las marcas de tiempo entrantes muestran un espacio mayor que un fotograma, la Mux avi escribe una entrada de índice con el tamaño cero, para indicar un marco quitado. En la reproducción de archivos, se generan nuevas marcas de tiempo en tiempo de ejecución, como se ha descrito anteriormente.

Para establecer la marca de tiempo en un ejemplo, llame al método IMediaSample::SetTime .

Tiempos de medios

Opcionalmente, el filtro también puede especificar un tiempo multimedia para el ejemplo. En una secuencia de vídeo, el tiempo multimedia representa el número de fotograma. En una secuencia de audio, el tiempo multimedia representa el número de muestra del paquete. Por ejemplo, si cada paquete contiene un segundo de audio de 44,1 kilohercios (kHz), el primer paquete tiene una hora de inicio multimedia de cero y un tiempo de detención multimedia de 44100. En una secuencia buscable, el tiempo multimedia siempre es relativo a la hora de inicio de la secuencia. Por ejemplo, supongamos que busca 2 segundos desde el inicio de una secuencia de vídeo de 15 fps. El primer ejemplo multimedia después de la búsqueda tiene una marca de tiempo de cero, pero un tiempo multimedia de 30.

Los filtros de representador y mux pueden usar el tiempo multimedia para determinar si se han quitado fotogramas o muestras, comprobando si hay huecos. Sin embargo, los filtros no son necesarios para establecer el tiempo multimedia. Para establecer la hora multimedia en un ejemplo, llame al método IMediaSample::SetMediaTime .

Hora y relojes en DirectShow