Configurando e recuperando a posição
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo 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 Captura de Áudio/Vídeo 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.]
O grafo de filtro mantém dois valores de posição, posição atual e posição de parada. Eles são definidos da seguinte maneira:
- Quando o grafo está em execução, a posição atual é a posição de reprodução atual, em relação ao início da origem. Quando o grafo é interrompido ou pausado, a posição atual é o ponto em que o streaming começará no próximo comando de execução.
- A posição de parada é o ponto em que o fluxo terminará. Quando o grafo atinge a posição de parada, nenhum dado é transmitido e o gerenciador de grafo de filtro posta um evento EC_COMPLETE . (No entanto, o grafo não muda automaticamente para um estado parado. Para obter mais informações, consulte Respondendo a eventos.)
Para recuperar esses valores, chame o método IMediaSeeking::GetPositions . Os valores retornados são sempre relativos à fonte de mídia original. Por padrão, os valores estão em unidades de tempo de referência. Em alguns casos, você pode alterar as unidades de tempo; para obter mais informações, consulte Formatos de tempo para comandos Seek.
Para buscar uma nova posição ou definir uma nova posição de parada, chame o método IMediaSeeking::SetPositions , conforme mostrado no exemplo a seguir:
#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
);
Observação
Um segundo é 10.000.000 unidades de tempo de referência. Para conveniência, o exemplo define esse valor como ONE_SECOND. Se você estiver usando a biblioteca de classe base do DirectShow, as UNIDADES constantes têm o mesmo valor.
O parâmetro rtNow especifica a nova posição atual. O segundo parâmetro é um sinalizador que define como interpretar rtNow. Neste exemplo, o sinalizador AM_SEEKING_AbsolutePositioning indica que rtNow especifica uma posição absoluta na origem. Portanto, o grafo de filtro buscará uma posição a dois segundos do início do fluxo. O parâmetro rtStop dá o tempo de parada. O último parâmetro especifica que rtStop também é uma posição absoluta.
Para especificar uma posição relativa ao valor de posição anterior, use o sinalizador AM_SEEKING_RelativePositioning. Para deixar um dos valores de posição inalterados, use o sinalizador AM_SEEKING_NoPositioning. O parâmetro de tempo correspondente pode ser NULL nesse caso. O exemplo a seguir busca avançar em 10 segundos, mas deixa a posição de parada inalterada:
REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
&rtNow, AM_SEEKING_RelativePositioning,
NULL, AM_SEEKING_NoPositioning
);
Se o grafo de filtro for interrompido, o renderizador de vídeo não atualizará a imagem após uma operação de busca. Para o usuário, ele aparecerá como se a busca não tivesse acontecido. Para atualizar a imagem, pause o grafo após a operação de busca. Pausar o grafo indica um novo quadro de vídeo para o renderizador de vídeo. Você pode usar o método IMediaControl::StopWhenReady , que pausa o grafo e o interrompe.