Share via


Produzione di dati in un filtro di acquisizione

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questo argomento descrive come un filtro di acquisizione DirectShow personalizzato deve generare dati di output.

Modifica dello stato del filtro

Un filtro di acquisizione deve produrre dati solo quando il filtro è in esecuzione. Non inviare dati dai pin quando il filtro viene sospeso. Restituisce inoltre VFW_S_CANT_CUE dal metodo CBaseFilter::GetState quando il filtro viene sospeso. Questo valore restituito indica a Filter Graph Manager che non deve attendere alcun dato dal filtro mentre il filtro viene sospeso. Per altre informazioni, vedere Stati di filtro.

Il codice seguente illustra come implementare il metodo IMediaFilter::GetState :

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
    CheckPointer(pState, E_POINTER);
    *pState = m_State;
    if (m_State == State_Paused)
    {
        return VFW_S_CANT_CUE;
    }
    else
    {
        return S_OK;
    }
}

Controllo dei singoli flussi

I pin di output di un filtro di acquisizione devono supportare l'interfaccia IAMStreamControl , in modo che un'applicazione possa attivare o disattivare singolarmente ogni pin. Ad esempio, un'applicazione può visualizzare in anteprima senza acquisire e quindi passare alla modalità di acquisizione senza ricompilare il grafico del filtro. È possibile usare la classe CBaseStreamControl per implementare questa interfaccia.

Timestamp

Quando il filtro acquisisce un esempio, timestamp dell'esempio con l'ora di flusso corrente. L'ora di fine è l'ora di inizio e la durata. Ad esempio, se il filtro acquisisce a dieci campioni al secondo e il tempo di flusso è pari a 200.000.000 unità quando il filtro acquisisce l'esempio, i timestamp devono essere 200000000 e 20100000000. (Ci sono 10.000.000 unità al secondo).

Per calcolare l'ora di flusso, chiamare il metodo IReferenceClock::GetTime per ottenere l'ora di riferimento corrente e quindi substrare l'ora di inizio originale. In alternativa, chiamare il metodo CBaseFilter::StreamTime , che esegue lo stesso calcolo. Per impostare il timestamp su un esempio, chiamare il metodo IMediaSample::SetTime .

Se il filtro ha un pin di anteprima, tuttavia, gli esempi dal pin di anteprima non devono avere timestamp. Il motivo è che gli esempi raggiungeranno sempre il renderer leggermente dopo l'ora di acquisizione. Se gli esempi vengono contrassegnati come timestamp, il renderer li tratterà in ritardo e potrebbe provare a recuperare eliminando campioni. Per altre informazioni, vedere Filtri acquisizione video DirectShow. Si noti che l'interfaccia IAMStreamControl richiede il pin per tenere traccia dei tempi di esempio. Per un pin di anteprima, potrebbe essere necessario modificare l'implementazione in modo che non si basa sui timestamp.

I timestamp devono sempre aumentare da un campione al successivo. Questo vale anche quando il filtro viene sospeso. Se il filtro viene eseguito, sospende e quindi viene eseguito di nuovo, il primo esempio dopo la pausa deve avere un timestamp maggiore rispetto all'ultimo esempio prima della pausa.

A seconda dei dati di acquisizione, potrebbe essere necessario impostare il tempo multimediale sugli esempi.

Per altre informazioni, vedere Time and Clocks in DirectShow.

Filtri di acquisizione video DirectShow

Ora e orologi in DirectShow

Scrittura di filtri di acquisizione