Orígenes activos
[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.
Un origen activo, también denominado origen de inserción, recibe datos en tiempo real. Entre los ejemplos se incluyen la captura de vídeo y las difusiones de red. En general, un origen activo no puede controlar la velocidad a la que llegan los datos.
Se considera que un filtro es un origen activo si se cumple alguna de las siguientes condiciones:
- El filtro devuelve la marca AM_FILTER_MISC_FLAGS_IS_SOURCE del método IAMFilterMiscFlags::GetMiscFlags , Y al menos uno de sus pines de salida expone la interfaz IAMPushSource .
- El filtro expone la interfaz IKsPropertySet y tiene un pin de captura (PIN_CATEGORY_CAPTURE). Para obtener más información, vea Anclar conjunto de propiedades .
Si un filtro de origen activo proporciona un reloj, el Administrador de gráficos de filtros preferirá ese reloj cuando elija el reloj de referencia del grafo. Consulte Relojes de referencia para obtener más información.
Latency
La latencia de un filtro es la cantidad de tiempo que tarda el filtro en procesar un ejemplo. En el caso de los orígenes activos, la latencia viene determinada por el tamaño del búfer usado para contener muestras. Por ejemplo, supongamos que el gráfico de filtros tiene un origen de vídeo con una latencia de 33 milisegundos (ms) y un origen de audio con una latencia de 500 ms. Cada fotograma de vídeo llega al representador de vídeo aproximadamente 470 ms antes de que la muestra de audio coincidente llegue al representador de audio. A menos que el gráfico compensa la diferencia, el audio y el vídeo no se sincronizarán.
Los orígenes dinámicos se pueden sincronizar a través de la interfaz IAMPushSource . El Administrador de gráficos de filtros no sincroniza los orígenes activos a menos que la aplicación habilite la sincronización llamando al método IAMGraphStreams::SyncUsingStreamOffset . Si la sincronización está habilitada, Filter Graph Manager consulta cada filtro de origen para IAMPushSource. Si el filtro admite IAMPushSource, el Administrador de gráficos de filtros llama a IAMLatency::GetLatency para recuperar la latencia esperada del filtro. (La interfaz IAMPushSource hereda IAMLatency). A partir de los valores de latencia combinados, el Administrador de gráficos de filtros determina la latencia máxima esperada en el gráfico. A continuación, llama a IAMPushSource::SetStreamOffset para proporcionar a cada filtro de origen un desplazamiento de flujo, que ese filtro agrega a las marcas de tiempo que genera.
Este método está pensado principalmente para la versión preliminar en directo. Sin embargo, tenga en cuenta que un pin de vista previa en un dispositivo de captura en vivo (por ejemplo, una cámara) no establece marcas de tiempo en los ejemplos que entrega. Por lo tanto, para usar este método con un dispositivo de captura en vivo, debe obtener una vista previa del pin de captura. Para obtener más información, vea DirectShow Video Capture Filters.
Actualmente, la interfaz IAMPushSource es compatible con el filtro de captura de VFW y el filtro captura de audio .
Coincidencia de frecuencia
Si un filtro de representador programa muestras con un reloj de referencia, pero el filtro de origen los genera mediante un reloj diferente, los problemas pueden producirse en la reproducción. El representador puede ejecutarse más rápido que el origen, lo que provoca brechas en los datos. O bien, podría ejecutarse más lentamente que el origen, lo que provoca que las muestras se "agrupan" hasta que, en algún momento, el gráfico quite las muestras. Normalmente, un origen activo no puede controlar su velocidad de producción, por lo que, en su lugar, el representador debe coincidir con las tasas con el origen.
Actualmente, solo el representador de audio realiza la coincidencia de velocidad, ya que los problemas en la reproducción de audio son más perceptibles que los errores en el vídeo. Para realizar la coincidencia de velocidad, el representador de audio debe seleccionar algo con el que coincidirá con las tasas. Usa el siguiente algoritmo:
- Si el gráfico no usa un reloj de referencia, el representador de audio no intenta coincidir con las tasas. (Siempre que el gráfico no tenga ningún reloj de referencia, las muestras siempre se representan inmediatamente a medida que llegan).
- De lo contrario, si hay un reloj de referencia para el gráfico, el representador de audio comprueba si hay un origen activo ascendente, con los criterios descritos anteriormente. Si no es así, el representador de audio no coincide con las tasas.
- Si hay un origen activo ascendente y ese origen expone la interfaz IAMPushSource en su pin de salida, el representador de audio llama a IAMPushSource::GetPushSourceFlags. Busca una de las siguientes marcas:
- AM_PUSHSOURCECAPS_INTERNAL_RM. Esta marca significa que el filtro de origen tiene su propio mecanismo de coincidencia de velocidad, por lo que el representador de audio no coincide con las tasas.
- AM_PUSHSOURCECAPS_NOT_LIVE. Esta marca significa que el filtro de origen no es realmente un origen activo, aunque expone la interfaz IAMPushSource . Por lo tanto, el representador de audio no coincide con las tasas.
- AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Esta marca significa que el filtro de origen usa un reloj privado para generar marcas de tiempo. En este caso, el representador de audio coincide con las tasas con respecto a las marcas de tiempo. (Sin embargo, si los ejemplos no tienen marcas de tiempo, el representador omite esta marca).
- Si GetPushSourceFlags no devuelve marcas (cero), el comportamiento del representador de audio depende del reloj del gráfico y de si las muestras tienen marcas de tiempo:
- Si el representador de audio no es el reloj del gráfico, Y las muestras tienen marcas de tiempo, el representador de audio coincide con las tasas con respecto a las marcas de tiempo.
- Si los ejemplos no tienen marcas de tiempo, el representador de audio intenta coincidir con la velocidad de los datos de audio entrantes.
- Si el representador de audio es el reloj del gráfico, intenta coincidir con la velocidad de datos entrante.
El motivo del último caso es el siguiente: si el representador de audio es el reloj de referencia y el filtro de origen usa el mismo reloj para generar marcas de tiempo, el representador de audio no puede coincidir con las tasas con las marcas de tiempo. Si lo hiciera, en efecto intentaría hacer coincidir las tasas con sí mismas, lo que podría hacer que el reloj se desfase. Por lo tanto, en este caso, el representador coincide con la velocidad de los datos de audio entrantes.