Formati di ora per i comandi Seek

[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.

Molti dei metodi nell'interfaccia IMediaSeeking hanno parametri che esprimono i valori di posizione, ad esempio la posizione corrente o la posizione di arresto. Per impostazione predefinita, questi parametri sono espressi in unità di 100 nanosecondi, detti anche tempo di riferimento. Qualsiasi filtro in grado di cercare deve supportare la ricerca in base al tempo di riferimento. Alcuni filtri possono cercare anche usando altre unità di tempo, ad esempio la ricerca di un determinato numero di fotogramma o la ricerca di un offset di byte specificato all'interno di un flusso. Ognuna di queste unità temporali viene chiamata formato ora ed è definita da un identificatore univoco globale (GUID). Per un elenco dei formati di ora definiti da DirectShow, vedere GUID di formato ora. Terze parti possono anche definire GUID per formati di ora personalizzati.

Per determinare se i filtri attualmente presenti nel grafico del filtro supportano un formato di ora specifico, chiamare il metodo IMediaSeeking::IsFormatSupported . Il metodo restituisce S_OK se il formato è supportato. In caso contrario, restituisce S_FALSE o un codice di errore. Se è supportato un formato, è possibile passare a tale formato chiamando il metodo IMediaSeeking::SetTimeFormat . Se il metodo SetTimeFormat ha esito positivo, i comandi seek successivi vengono espressi usando il nuovo formato ora.

Nell'esempio seguente viene verificato se il grafico supporta la ricerca in base al numero di fotogramma. In tal caso, cerca di incorniciare il numero 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);
    }
}

Si noti che i formati di ora si applicano solo ai comandi di ricerca. Non influiscono sulla riproduzione del grafo o su altre azioni.