Reloj de presentación
El reloj de presentación es un objeto que genera la hora del reloj para una presentación. La hora notificada por el reloj de presentación se denomina tiempo de presentación. Todas las secuencias de una presentación se sincronizan con el tiempo de presentación. El reloj de presentación expone las siguientes interfaces.
Interfaz | Descripción |
---|---|
IMFPresentationClock | Interfaz principal para usar el reloj de presentación. |
IMFRateControl | Controla la velocidad del reloj. |
IMFTimer | Proporciona una devolución de llamada del temporizador. |
IMFShutdown | Apaga el reloj de presentación. |
Los receptores multimedia usan la hora de presentación para programar cuándo representar muestras. Cada vez que un receptor de medios recibe un nuevo ejemplo, obtiene la marca de tiempo de la muestra y representa la muestra en el momento indicado, o lo más cerca posible de ese momento. Dado que todos los receptores multimedia de una topología comparten el mismo reloj de presentación, se sincronizan varias secuencias (como audio y vídeo). Los orígenes multimedia y las transformaciones no usan el reloj de presentación, ya que no programan cuándo entregar muestras. En su lugar, generan muestras cada vez que la canalización solicita un nuevo ejemplo.
Si usa la sesión multimedia para la reproducción, la sesión multimedia controla todos los detalles de la creación del reloj de presentación, la selección de un origen de hora y la notificación a los receptores multimedia. La aplicación puede usar el reloj de presentación para obtener la hora de presentación actual durante la reproducción, pero de lo contrario no llamará a ningún método en el reloj de presentación.
Hora del reloj y estados del reloj
Para obtener la hora del reloj más reciente del reloj de la presentación, llame a IMFPresentationClock::GetTime. Los tiempos de reloj siempre están en unidades de 100 nanosegundos, por lo que un segundo es de 10 000 000 tics (10^7). Esto corresponde a una frecuencia de 10 MHz.
El reloj de presentación tiene tres estados: En ejecución, en pausa y detenido.
- Para ejecutar el reloj, llame a IMFPresentationClock::Start. El método Start especifica la hora de inicio del reloj. Mientras se ejecuta el reloj, el tiempo del reloj aumenta desde la hora de inicio, a la velocidad del reloj actual.
- Para pausar el reloj, llame a IMFPresentationClock::P ause. Mientras el reloj está en pausa, la hora del reloj no avanza y GetTime devuelve la hora en la que se ha pausado el reloj.
- Para detener el reloj, llame a IMFPresentationClock::Stop. Cuando se detiene el reloj, la hora del reloj no avanza y GetTime devuelve cero.
De forma predeterminada, el reloj avanza a una velocidad de 1,0, lo que significa 1 tic por 100 nanosegundos. Para cambiar la velocidad a la que avanza el reloj, consulte el reloj de presentación para la interfaz IMFRateControl y llame a IMFRateControl::SetRate.
Los objetos pueden recibir notificaciones de cambios de estado (incluidos los cambios de velocidad) del reloj de presentación. Para recibir notificaciones, implemente la interfaz IMFClockStateSink y llame a IMFPresentationClock::AddClockStateSink en el reloj de presentación. Antes de cerrar, llame a IMFPresentationClock::RemoveClockStateSink para anular el registro del objeto. Los receptores multimedia usan este mecanismo para recibir notificaciones del reloj.
Tiempos de presentación
Un receptor multimedia intenta programar cada ejemplo para que la muestra se represente en el momento correcto o lo más cerca posible del momento correcto. Se aplican las definiciones siguientes:
- Tiempo de presentación. Hora en que se debe representar un ejemplo. El tiempo se da en unidades de 100 nanosegundos.
- Tiempo multimedia. Hora relativa al inicio del contenido. Por ejemplo, si un archivo de vídeo tiene 10 segundos de duración, el punto medio del archivo tiene un tiempo multimedia de 5 segundos.
- Marca de tiempo. Hora marcada en un ejemplo multimedia. Para obtener la marca de tiempo, llame a IMFSample::GetSampleTime. Cuando un origen multimedia genera una muestra, establece la marca de tiempo igual a la hora del medio. La sesión multimedia traduce la marca de tiempo en tiempo de presentación.
De forma predeterminada, el tiempo multimedia y la hora de presentación son los mismos, por ejemplo, si un fotograma de vídeo aparece 5 segundos en el archivo de origen, el tiempo multimedia y el tiempo de presentación son ambos 5 segundos. Si usa el origen del secuenciador, el modelo de control de tiempo es algo más complicado, para permitir transiciones fluidas entre segmentos. Para obtener más información sobre el modelo de tiempo del origen del secuenciador, vea Tiempos de presentación de secuencia.
El origen de medios siempre establece la marca de tiempo igual a la hora del medio. Si el tiempo de presentación no está alineado con el tiempo multimedia, la sesión multimedia convierte las marcas de tiempo en los ejemplos multimedia. En el momento en que el receptor recibe una muestra, la marca de tiempo de la muestra se ha convertido en tiempo de presentación. El receptor programa el ejemplo con la hora actual del reloj de presentación. (Los receptores sin velocidad son una excepción, porque omiten el reloj de presentación).
Si la aplicación busca una nueva posición, la sesión multimedia reinicia el reloj de presentación en el tiempo de búsqueda especificado. Por ejemplo, si la aplicación busca la posición de 5 segundos en el archivo, la sesión multimedia inicia el reloj en 5 segundos. El origen multimedia puede entregar muestras con una marca de tiempo ligeramente anterior si el tiempo de búsqueda no se encuentra en un límite de fotograma clave. Esto es necesario para que los descodificadores puedan descodificar todos los fotogramas. La sesión multimedia quita o recorta muestras antes de que lleguen a los receptores de medios para que coincidan con el tiempo de búsqueda solicitado. Por ejemplo, si el tiempo de búsqueda es de 5 segundos, la primera muestra de audio podría comenzar en 4,5 segundos. La sesión multimedia recortará los primeros 0,5 segundos desde la primera muestra de audio descodificada.
Crear el reloj de presentación
Para crear el reloj de presentación, llame a MFCreatePresentationClock. Para apagar el reloj, consulte la interfaz IMFShutdown y llame a IMFShutdown::Shutdown. El autor de la llamada de MFCreatePresentationClock es responsable de llamar a Shutdown; en la mayoría de los casos, esta es la sesión multimedia en lugar de la aplicación.
Orígenes de tiempo de presentación
A pesar de su nombre, el reloj de presentación no implementa realmente un reloj. En su lugar, obtiene las horas del reloj de otro objeto, denominada origen de hora de presentación. El origen de hora puede ser cualquier objeto que genere tics de reloj precisos y exponga la interfaz IMFPresentationTimeSource . En la siguiente ilustración se muestra este proceso.
Cuando se crea por primera vez el reloj de presentación, no tiene un origen de hora. Para establecer el origen de hora, llame a IMFPresentationClock::SetTimeSource con un puntero a la interfaz IMFPresentationTimeSource del origen de hora. Un origen de hora admite los mismos estados que el reloj de presentación (en ejecución, en pausa y detención) y debe implementar la interfaz IMFClockStateSink . El reloj de presentación usa esta interfaz para notificar al origen de hora cuándo cambiar el estado. De este modo, el origen de la hora proporciona los tics del reloj, pero el reloj de presentación inicia cambios de estado en el reloj.
Algunos receptores multimedia tienen acceso a un reloj preciso y, por tanto, exponen la interfaz IMFPresentationTimeSource . En concreto, el representador de audio puede usar la frecuencia de la tarjeta de sonido como reloj. En la reproducción de audio, es útil que el representador de audio actúe como origen de tiempo, de modo que el vídeo se sincronice con la velocidad de reproducción de audio. Esto generalmente produce mejores resultados que intentar hacer coincidir el audio con un reloj externo.
Media Foundation también proporciona un origen de hora de presentación basado en el reloj del sistema. Para crear este objeto, llame a MFCreateSystemTimeSource. El origen de hora del sistema se puede usar cuando ningún receptor multimedia proporciona un origen de hora.
En general, un receptor de medios debe usar el reloj de presentación proporcionado para él, independientemente del origen de hora que use el reloj de presentación. Esta regla se aplica incluso cuando un receptor multimedia implementa IMFPresentationTimeSource. Si el reloj de presentación usa algún otro origen de hora, el receptor de medios debe seguir ese origen de hora, no su propio reloj interno.
Hay dos situaciones en las que un receptor de medios no seguirá el reloj de presentación:
Algunos receptores multimedia no tienen velocidad. Si un receptor de medios no tiene frecuencia, consume muestras lo más rápido posible, sin programarlas según el reloj de presentación. Normalmente, los receptores sin frecuencia escriben datos en un archivo, por lo que es conveniente completar la operación lo más rápido posible. Un receptor sin velocidad devuelve la marca MEDIASINK_RATELESS en su método IMFMediaSink::GetCharacteristics . Cuando todos los receptores de una topología no tienen frecuencia, la sesión multimedia inserta los datos a través de la canalización lo antes posible.
Algunos receptores de medios no pueden coincidir con las tasas con un origen de tiempo distinto de ellos mismos. Si es así, el receptor devuelve la marca MEDIASINK_CANNOT_MATCH_CLOCK en su método GetCharacteristics . La canalización todavía puede usar otro origen de hora, pero los resultados serán menores que óptimos. Es probable que el receptor se quede atrás y cause errores durante la reproducción.
Temas relacionados