Impostazione dell'orologio grafico

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

Quando si compila un grafico di filtro, Gestione filtrare Graph sceglie automaticamente un orologio di riferimento per il grafico. Tutti i filtri nel grafico vengono sincronizzati con l'orologio di riferimento. In particolare, i filtri del renderer usano l'orologio di riferimento per determinare l'ora di presentazione di ogni esempio.

In genere non c'è motivo per cui un'applicazione esegue l'override della scelta dell'orologio di riferimento di Filter Graph Manager. Tuttavia, è possibile farlo chiamando il metodo IMediaFilter::SetSyncSource in Filter Graph Manager. Questo metodo accetta un puntatore all'interfaccia IReferenceClock dell'orologio. Chiamare il metodo mentre il grafico viene arrestato.

Se un filtro fornisce un orologio, è possibile ottenere il puntatore IReferenceClock chiamando QueryInterface sul filtro. In alternativa, è possibile implementare un orologio di riferimento esterno non fornito da un filtro, purché l'orologio esterno implementi IReferenceClock. Nell'esempio seguente viene illustrato come specificare un orologio:

IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
    IID_IGraphBuilder, (void **)&pGraph);

// Build the graph.
pGraph->RenderFile(L"C:\\Example.avi", 0);

// Create your clock.
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
    // Set the graph clock.
    IMediaFilter *pMediaFilter = 0;
    pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
    pMediaFilter->SetSyncSource(pClock);
    pClock->Release();
    pMediaFilter->Release();
}

Questo esempio presuppone che CreateMyPrivateClock sia una funzione definita dall'applicazione che crea un orologio e restituisce un puntatore IReferenceClock .

È anche possibile impostare il grafico del filtro per l'esecuzione senza orologio chiamando SetSyncSource con il valore NULL. Se non è presente alcun orologio, il grafico viene eseguito il più rapidamente possibile. Senza orologio, i filtri del renderer non attendono l'ora di presentazione di un campione. Eseguono invece il rendering di ogni esempio non appena arriva. L'impostazione del grafico per l'esecuzione senza un orologio è utile se si vogliono elaborare rapidamente i dati, anziché visualizzare in anteprima in tempo reale.

Attività DirectShow di base

Classe CBaseReferenceClock

Ora e orologi in DirectShow