Formatos de hora para los comandos Seek

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

Muchos de los métodos de la interfaz IMediaSeeking tienen parámetros que expresan valores de posición, como la posición actual o la posición de detención. De forma predeterminada, estos parámetros se expresan en unidades de 100 nanosegundos, también denominados tiempo de referencia. Cualquier filtro que pueda buscar debe admitir la búsqueda por hora de referencia. Algunos filtros también pueden buscar con otras unidades de tiempo, como buscar un número de fotograma determinado o buscar un desplazamiento de bytes determinado dentro de una secuencia. Cada una de estas unidades de tiempo se denomina formato de hora y se define mediante un identificador único global (GUID). Para obtener una lista de los formatos de hora definidos por DirectShow, consulte GUID de formato de hora. Los terceros también pueden definir GUID para formatos de hora personalizados.

Para determinar si los filtros actualmente en el gráfico de filtros admiten un formato de hora determinado, llame al método IMediaSeeking::IsFormatSupported . El método devuelve S_OK si se admite el formato. De lo contrario, devuelve S_FALSE o un código de error. Si se admite un formato, puede cambiar a ese formato llamando al método IMediaSeeking::SetTimeFormat . Si el método SetTimeFormat se realiza correctamente, los comandos de búsqueda subsiguientes se expresan con el nuevo formato de hora.

En el ejemplo siguiente se comprueba si el gráfico admite la búsqueda por número de fotograma. Si es así, busca enmarcar el número 20:

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // Seek to frame number 20.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

Tenga en cuenta que los formatos de hora solo se aplican a los comandos seek. No afectan a la reproducción de grafos ni a otras acciones.