Compartilhar via


Formatos de tempo para comandos Seek

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Muitos dos métodos na interface IMediaSeeking têm parâmetros que expressam valores de posição, como posição atual ou posição de parada. Por padrão, esses parâmetros são expressos em unidades de 100 nanossegundos, também chamados de tempo de referência. Qualquer filtro que possa buscar deve dar suporte à busca por tempo de referência. Alguns filtros também podem buscar o uso de outras unidades de tempo, como buscar um número de quadro específico ou buscar um determinado deslocamento de bytes dentro de um fluxo. Cada uma dessas unidades de tempo é chamada de formato de tempo e é definida por um GUID (identificador global exclusivo). Para obter uma lista dos formatos de hora definidos pelo DirectShow, consulte GUIDs de formato de tempo. Terceiros também podem definir GUIDs para formatos de hora personalizados.

Para determinar se os filtros atualmente no grafo de filtro dão suporte a um formato de hora específico, chame o método IMediaSeeking::IsFormatSupported . O método retornará S_OK se houver suporte para o formato. Caso contrário, ele retornará S_FALSE ou um código de erro. Se houver suporte para um formato, você poderá alternar para esse formato chamando o método IMediaSeeking::SetTimeFormat . Se o método SetTimeFormat for bem-sucedido, os comandos de busca subsequentes serão expressos usando o novo formato de hora.

O exemplo a seguir verifica se o grafo dá suporte à busca por número de quadro. Nesse caso, ele busca enquadrar o 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);
    }
}

Observe que os formatos de hora se aplicam somente aos comandos seek. Elas não afetam a reprodução de grafo nem outras ações.