Condividi tramite


Impostazione e recupero della posizione

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il grafico del filtro mantiene due valori di posizione, la posizione corrente e la posizione di arresto. Questi sono definiti come segue:

  • Quando il grafico è in esecuzione, la posizione corrente è la posizione di riproduzione corrente, rispetto all'inizio dell'origine. Quando il grafico viene arrestato o sospeso, la posizione corrente è il punto in cui il flusso inizierà nel comando di esecuzione successivo.
  • La posizione di arresto è il punto in cui termina il flusso. Quando il grafico raggiunge la posizione di arresto, non vengono trasmessi più dati e gestione grafo filtro pubblica un evento EC_COMPLETE . Il grafico non passa automaticamente a uno stato arrestato, tuttavia. Per altre informazioni, vedere Risposta agli eventi.

Per recuperare questi valori, chiamare il metodo IMediaSeeking::GetPositions . I valori restituiti sono sempre relativi all'origine multimediale originale. Per impostazione predefinita, i valori sono in unità di tempo di riferimento. In alcuni casi, è possibile modificare le unità di tempo; per altre informazioni, vedere Formati temporali per i comandi Seek.

Per cercare una nuova posizione o impostare una nuova posizione di arresto, chiamare il metodo IMediaSeeking::SetPositions , come illustrato nell'esempio seguente:

#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 secondo è 10.000.000 unità di tempo di riferimento. Per praticità, questo valore viene definito come ONE_SECOND. Se si usa la libreria di classi di base DirectShow, la costante UNITS ha lo stesso valore.

 

Il parametro rtNow specifica la nuova posizione corrente. Il secondo parametro è un flag che definisce come interpretare rtNow. In questo esempio, il flag AM_SEEKING_AbsolutePositioning indica che rtNow specifica una posizione assoluta nell'origine. Di conseguenza, il grafico del filtro cercherà una posizione di due secondi dall'inizio del flusso. Il parametro rtStop fornisce l'ora di arresto. L'ultimo parametro specifica che rtStop è anche una posizione assoluta.

Per specificare una posizione rispetto al valore di posizione precedente, usare il flag AM_SEEKING_RelativePositioning. Per lasciare invariati uno dei valori di posizione, usare il flag AM_SEEKING_NoPositioning. Il parametro time corrispondente può essere NULL in questo caso. L'esempio seguente cerca in avanti di 10 secondi, ma lascia invariata la posizione di arresto:

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

Se il grafico del filtro viene arrestato, il renderer video non aggiorna l'immagine dopo un'operazione di ricerca. All'utente verrà visualizzato come se la ricerca non fosse stata eseguita. Per aggiornare l'immagine, sospendere il grafico dopo l'operazione di ricerca. La sospensione del grafico indica un nuovo fotogramma video per il renderer video. È possibile usare il metodo IMediaControl::StopWhenReady , che sospende il grafico e lo arresta.