Establecer y recuperar la posición

[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.

El gráfico de filtros mantiene dos valores de posición, posición actual y posición de detención. Estos se definen de la siguiente manera:

  • Cuando se ejecuta el gráfico, la posición actual es la posición de reproducción actual, con respecto al principio del origen. Cuando el gráfico está detenido o en pausa, la posición actual es el punto donde comenzará el streaming en el siguiente comando de ejecución.
  • La posición de detención es el punto donde finalizará la secuencia. Cuando el gráfico alcanza la posición de detención, no se transmiten más datos y el administrador de gráficos de filtros publica un evento de EC_COMPLETE . (Sin embargo, el gráfico no cambia automáticamente a un estado detenido. Para obtener más información, vea Responder a eventos).

Para recuperar estos valores, llame al método IMediaSeeking::GetPositions . Los valores devueltos siempre son relativos al origen multimedia original. De forma predeterminada, los valores están en unidades de tiempo de referencia. En algunos casos, puede cambiar las unidades de tiempo; para obtener más información, vea Formatos de hora para comandos Seek.

Para buscar una nueva posición o establecer una nueva posición de detención, llame al método IMediaSeeking::SetPositions , como se muestra en el ejemplo siguiente:

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

Nota:

Un segundo es 10 000 000 unidades de tiempo de referencia. Por comodidad, en el ejemplo se define este valor como ONE_SECOND. Si usa la biblioteca de clases base DirectShow, la constante UNITS tiene el mismo valor.

 

El parámetro rtNow especifica la nueva posición actual. El segundo parámetro es una marca que define cómo interpretar rtNow. En este ejemplo, la marca AM_SEEKING_AbsolutePositioning indica que rtNow especifica una posición absoluta en el origen. Por lo tanto, el gráfico de filtro buscará una posición de dos segundos desde el inicio de la secuencia. El parámetro rtStop proporciona la hora de detención. El último parámetro especifica que rtStop también es una posición absoluta.

Para especificar una posición relativa al valor de posición anterior, use la marca AM_SEEKING_RelativePositioning. Para dejar uno de los valores de posición sin cambios, use la marca AM_SEEKING_NoPositioning. El parámetro time correspondiente puede ser NULL en ese caso. En el ejemplo siguiente se busca hacia delante en 10 segundos, pero deja la posición de detención sin cambios:

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

Si se detiene el gráfico de filtro, el representador de vídeo no actualiza la imagen después de una operación de búsqueda. Para el usuario, aparecerá como si no se hubiera producido la búsqueda. Para actualizar la imagen, pause el gráfico después de la operación de búsqueda. Al pausar el grafo se indica un nuevo fotograma de vídeo para el representador de vídeo. Puede usar el método IMediaControl::StopWhenReady , que pausa el gráfico y, a continuación, lo detiene.