Impostazione delle proprietà su effetti e transizioni

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

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

Molti effetti di DirectShow Editing Services e transizioni supportano proprietà che controllano il comportamento. Un'applicazione può impostare il valore di una proprietà usando l'interfaccia IPropertySetter . L'effetto sottostante o l'oggetto transizione deve supportare IDispatch per l'impostazione delle proprietà. Con effetti video e transizioni, l'applicazione può impostare un intervallo di valori che cambiano nel tempo. Ad esempio, è possibile impostare una transizione di cancellazione per spostarsi avanti e indietro nel frame. Con gli effetti audio, il valore della proprietà è statico e non può cambiare nel tempo. L'unica eccezione è l'effetto Busta volume , che supporta una proprietà dinamica per il livello del volume.

Per impostare una proprietà, seguire questa procedura.

  1. Creare un'istanza del setter della proprietà (CLSID_PropertySetter).
  2. Compilare DEXTER_PARAM e DEXTER_VALUE strutture con i dati delle proprietà. Queste strutture sono descritte di seguito.
  3. Passare le strutture DEXTER_PARAM e DEXTER_VALUE al metodo IPropertySetter::AddProp .
  4. Ripetere i passaggi 2 e 3 per ogni proprietà da impostare.
  5. Passare il puntatore all'interfaccia IPropertySetter al metodo IAMTimelineObj::SetPropertySetter .

La struttura DEXTER_PARAM specifica la proprietà da impostare. Contiene i membri seguenti.

  • Nome: nome della proprietà
  • dispID: Riservato, deve essere zero
  • nValues: numero di valori

La struttura DEXTER_VALUE specifica il valore di una proprietà in un determinato momento. Contiene i membri seguenti.

  • v: tipo VARIANT che specifica un nuovo valore per la proprietà . Il membro vt di questo variant definisce il tipo di dati della proprietà . Per altre informazioni sul tipo VARIANT , vedere Windows SDK.
  • rt: ora di riferimento in cui la proprietà presuppone questo valore, rispetto all'ora di inizio dell'effetto o della transizione. L'ora di inizio dell'effetto o della transizione è relativa all'ora di inizio dell'oggetto padre.
  • dwInterp: flag che specifica la modalità di modifica della proprietà dal valore precedente al nuovo valore. Con il flag DEXTERF_JUMP, la proprietà passa immediatamente al nuovo valore al momento specificato. Con il flag DEXTERF_INTERPOLATE, la proprietà viene interpolata in modo lineare dal valore precedente.

Se si imposta il membro vt su VT_BSTR, il setter della proprietà esegue le conversioni necessarie. Per i valori a virgola mobile, includere lo zero iniziale prima della posizione decimale. Ad esempio, 0.3, non .3.

Nota

Le applicazioni devono evitare di basarsi sulla conversione da BSTRa valori numerici. Se la proprietà ha un valore numerico, è possibile utilizzare il tipo VARIANT numerico appropriato.

 

Il valore di una proprietà può cambiare nel tempo, pertanto il metodo IPropertySetter::AddProp accetta una singola struttura DEXTER_PARAM e un puntatore a una matrice di strutture DEXTER_VALUE . La matrice definisce un set di valori basati sul tempo per la proprietà . I membri della matrice devono essere in ordine cronologico crescente e il membro nValues della struttura DEXTER_PARAM deve essere uguale alla lunghezza della matrice.

Nell'esempio di codice seguente vengono creati i dati delle proprietà per la transizione di cancellazione SMPTE . Imposta il codice di cancellazione su 120, che crea una cancellazione ovale. Imposta l'ora di riferimento su zero, che indica l'inizio della transizione.

IPropertySetter     *pProp;   // Property setter
IAMTimelineObj      *pTransObj;  // Transition object
// Create an SMPTE Wipe transition object. (Not shown)

hr = CoCreateInstance(CLSID_PropertySetter, NULL, CLSCTX_INPROC_SERVER,
    IID_IPropertySetter, (void**) &pProp);

// Error checking is omitted for clarity...

DEXTER_PARAM param;
DEXTER_VALUE *pValue = (DEXTER_VALUE*)CoTaskMemAlloc(sizeof(DEXTER_VALUE));

// Initialize the parameter. 
param.Name = SysAllocString(L"MaskNum");
param.dispID = 0;
param.nValues = 1;

// Initialize the value.
pValue->v.vt = VT_I4;
pValue->v.lVal = 120; // Oval
pValue->rt = 0;
pValue->dwInterp = DEXTERF_JUMP;

pProp->AddProp(param, pValue);

// Free allocated resources.
SysFreeString(param.Name);
VariantClear(&(pValue->v));
CoTaskMemFree(pValue);

// Set the property on the transition.
pTransObj->SetPropertySetter(pProp);
pProp->Release();

Modifica dinamica delle proprietà

Dopo aver eseguito il rendering di un progetto di modifica video, è possibile modificare le proprietà di un oggetto di transizione o effetto durante l'esecuzione del grafico. Tuttavia, ciò è possibile solo se si impostano proprietà su tale oggetto prima che l'applicazione denominata IRenderEngine::ConnectFrontEnd. In tal caso, è possibile chiamare IAMTimelineObj::GetPropertySetter sull'effetto o sulla transizione, cancellare o modificare le proprietà e le modifiche verranno apportate in modo dinamico man mano che il grafico è in esecuzione. Possono verificarsi anomalie visive mentre si verifica la modifica, pertanto questa opzione è consigliata solo per l'anteprima. Non modificare le proprietà durante la scrittura del progetto in un file.

Se non sono state impostate proprietà sull'effetto o sull'oggetto di transizione prima di chiamare ConnectFrontEnd, non è possibile aggiungervi proprietà durante l'esecuzione del grafico.

Uso di effetti e transizioni