Compartilhar via


Formatos de tempo para comandos seek

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture na 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 no 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 de 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 procurar deve dar suporte à busca por tempo de referência. Alguns filtros também podem buscar o uso de outras unidades de tempo, como procurar 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 tempo definidos pelo DirectShow, consulte guids de formato de tempo. Terceiros também podem definir GUIDs para formatos de tempo personalizados.

Para determinar se os filtros atualmente no grafo de filtro dão suporte a um formato de tempo 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 deIMediaSeeking::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 o quadro 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 tempo se aplicam somente a comandos de busca. Elas não afetam a reprodução do grafo ou outras ações.