Aggiunta di oggetti effetto e transizione

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

[Questa API non è supportata e può essere modificata o non disponibile in futuro.]

In DES viene rappresentato un effetto o una transizione con due oggetti:

  • Un oggetto sequenza temporale rappresenta l'effetto o la transizione all'interno della sequenza temporale. Per gli effetti, l'oggetto sequenza temporale supporta l'interfaccia IAMTimelineEffect . Per le transizioni, supporta l'interfaccia IAMTimelineTrans . Entrambi i tipi supportano l'interfaccia IAMTimelineObj .
  • L'oggetto secondario è un oggetto che implementa l'elaborazione dei dati per l'effetto o la transizione. L'oggetto sequenza temporale contiene un puntatore al subobject.

Per aggiungere un effetto o una transizione, seguire questa procedura.

1. Creare l'oggetto Sequenza temporale

Per creare l'oggetto sequenza temporale, chiamare il metodo IAMTimeline::CreateEmptyNode . Impostare il tipo uguale a TIMELINE_MAJOR_TYPE_EFFECT per un effetto o TIMELINE_MAJOR_TYPE_TRANSITION per una transizione.

Nell'esempio seguente viene creato un oggetto di transizione:

IAMTimelineObj *pTransObj = NULL;
pTimeline->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

2. Specificare l'oggetto secondario

L'oggetto sequenza temporale funge da wrapper per un altro oggetto, denominato subobject, che esegue il lavoro reale. L'oggetto secondario implementa una trasformazione dei dati che produce l'effetto o la transizione desiderati. Per un elenco di transizioni ed effetti forniti con DES, vedere Transizioni ed effetti.

Per impostare l'oggetto secondario, chiamare il metodo IAMTimelineObj::SetSubObjectGUID nell'oggetto sequenza temporale, passandolo all'identificatore di classe (CLSID) del subobject. DirectShow fornisce un enumeratore per effetti video e transizioni video, che è possibile usare per ottenere CLSID. Per altre informazioni, vedere Enumerazione di effetti e transizioni.

Nell'esempio seguente viene impostata la transizione di cancellazione SMPTE come subobject :

hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

3. Impostare i tempi di inizio e arresto

Per impostare gli orari di inizio e arresto, chiamare il metodo IAMTimelineObj::SetStartStop . Questi tempi sono relativi all'ora di inizio dell'oggetto padre. Gli effetti possono sovrapporsi all'interno dello stesso oggetto, ma non è possibile eseguire transizioni.

L'esempio seguente imposta l'ora di inizio su 5 secondi e l'ora di arresto su 10 secondi:

const REFERENCE_TIME ONE_SECOND = 10000000
hr = pTransObj->SetStartStop(5 * ONE_SECOND, 10 * ONE_SECOND);

Quando viene eseguito il rendering di una transizione, lo stato di avanzamento della transizione in ogni frame viene calcolato in base a una proprietà Progress , normalizzata in un intervallo compreso tra 0,0 e 1,0. DES usa l'ora di inizio di ogni frame per calcolare il valore di stato. Ciò significa che se l'ora di arresto della transizione è uguale all'ora di arresto di origine, il valore Progress non raggiungerà mai esattamente 1,0, perché l'ora di inizio dell'ultimo frame è leggermente superiore all'ora di arresto. Per fare in modo che la transizione raggiunga 1.0, impostare il tempo di arresto della transizione per essere almeno un frame precedente all'ora di arresto dell'origine.

4. Inserire l'oggetto nella sequenza temporale

Per inserire l'oggetto nella sequenza temporale, chiamare uno dei metodi seguenti nell'elemento padre, a seconda del tipo di oggetto:

Nel metodo IAMTimelineEffectable::EffectInsBefore è necessario specificare la priorità dell'effetto. Quando gli effetti si sovrappongono allo stesso oggetto, vengono applicati in ordine di priorità. L'effetto audio busta volume è un'eccezione; per informazioni dettagliate, vedere il riferimento all'effetto busta volume . All'interno di una composizione, tutte le tracce audio vengono combinate prima dell'applicazione degli effetti audio per tale composizione.

Poiché le transizioni non possono sovrapporsi allo stesso oggetto, non hanno un valore di priorità.

Nell'esempio seguente viene aggiunto l'oggetto di transizione a una traccia:

IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();

L'esempio esegue una query sull'oggetto track per l'interfaccia IAMTimelineTransable prima di chiamare AddTrans.

5. Impostare proprietà

Molti effetti e transizioni supportano proprietà personalizzate. Per informazioni, vedere Impostazione delle proprietà sugli effetti e sulle transizioni.

Esempio

Nell'esempio di codice seguente viene aggiunta una transizione di cancellazione SMPTE a una traccia. Si presuppone che l'oggetto track esista già nella sequenza temporale.

IAMTimeline *pTL;
IAMTimelineTrack *pTrack;

// Create timeline with track (not shown).

// Create the transition object. 
IAMTimelineObj *pTransObj = NULL;
hr = pTL->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

// Set the subobject. 
hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

// Set the start and stop times. 
hr = pTransObj->SetStartStop(50000000, 100000000);

// Insert the transition object into the timeline. 
IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();
pTransObj->Release();

Uso degli effetti e delle transizioni