Impostazione e recupero della posizione
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video 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 di riproduzione attuale è quella corrente rispetto all'inizio del file di origine. Quando il grafico viene arrestato o sospeso, la posizione corrente è il punto in cui inizierà il flusso 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 altri dati e il gestore dei grafici di filtro pubblica un evento EC_COMPLETE. Il grafico, tuttavia, non passa automaticamente a uno stato arrestato. Per ulteriori informazioni, vedere Rispondere 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 di tempo per i comandi di ricerca.
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 è di 10.000.000 unità di tempo di riferimento. Per praticità, l'esempio definisce questo valore come ONE_SECOND. Se si usa la libreria di classi 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 di AM_SEEKING_AbsolutePositioning indica che rtNow specifica una posizione assoluta nell'origine. Di conseguenza, il filtro grafico verrà posizionato a due secondi dal punto di 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 relativa al valore della posizione precedente, utilizzare il flag AM_SEEKING_RelativePositioning. Per lasciare invariati uno dei valori di posizione, usare il flag AM_SEEKING_NoPositioning. In tal caso, il parametro time corrispondente può essere NULL. 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 si verificasse. 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.