Festlegen von Eigenschaften für Effekte und Übergänge

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

[Diese API wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein.]

Viele DirectShow Editing Services-Effekte und -Übergänge unterstützen Eigenschaften, die ihr Verhalten steuern. Eine Anwendung kann den Wert einer Eigenschaft mithilfe der IPropertySetter-Schnittstelle festlegen. Das zugrunde liegende Effekt- oder Übergangsobjekt muss IDispatch zum Festlegen der Eigenschaften unterstützen. Mit Videoeffekten und Übergängen kann die Anwendung einen Bereich von Werten festlegen, der sich im Laufe der Zeit ändert. (Sie können z. B. einen Zurücksetzungsübergang so festlegen, dass er über den Frame hin- und her bewegt wird.) Bei Audioeffekten ist der Wert der Eigenschaft statisch und kann sich im Laufe der Zeit nicht ändern. Die einzige Ausnahme ist der Effekt "Volume Envelope" , der eine dynamische Eigenschaft für die Lautstärkeebene unterstützt.

Führen Sie zum Festlegen einer Eigenschaft die folgenden Schritte aus.

  1. Erstellen Sie eine instance des Eigenschaftensetters (CLSID_PropertySetter).
  2. Füllen Sie DEXTER_PARAM - und DEXTER_VALUE-Strukturen mit den Eigenschaftendaten aus. Diese Strukturen werden im Folgenden erläutert.
  3. Übergeben Sie die strukturen DEXTER_PARAM und DEXTER_VALUE an die IPropertySetter::AddProp-Methode .
  4. Wiederholen Sie die Schritte 2 und 3 für jede Eigenschaft, die Sie festlegen möchten.
  5. Übergeben Sie den IPropertySetter-Schnittstellenzeiger an die IAMTimelineObj::SetPropertySetter-Methode .

Die DEXTER_PARAM-Struktur gibt an, welche Eigenschaft festgelegt wird. Sie enthält die folgenden Member.

  • Name: Name der Eigenschaft
  • dispID: Reserviert, muss null sein
  • nValues: Anzahl der Werte

Die DEXTER_VALUE-Struktur gibt den Wert einer Eigenschaft zu einem bestimmten Zeitpunkt an. Sie enthält die folgenden Member.

  • v: VARIANT-Typ, der einen neuen Wert für die Eigenschaft angibt. Der vt-Member dieses VARIANT-Elements definiert den Datentyp der Eigenschaft. Weitere Informationen zum VARIANT-Typ finden Sie im Windows SDK.
  • rt: Referenzzeit, wenn die Eigenschaft diesen Wert annimmt, relativ zur Startzeit des Effekts oder Übergangs. Die Startzeit des Effekts oder Übergangs ist relativ zur Startzeit des übergeordneten Objekts.
  • dwInterp: Flag, das angibt, wie die Eigenschaft vom vorherigen Wert in den neuen Wert geändert wird. Mit dem flag DEXTERF_JUMP springt die Eigenschaft sofort zum neuen Wert zum angegebenen Zeitpunkt. Mit dem flag DEXTERF_INTERPOLATE wird die Eigenschaft linear vom vorherigen Wert interpoliert.

Wenn Sie das vt-Element auf VT_BSTR festlegen, führt der Eigenschaftensetter alle erforderlichen Konvertierungen durch. Schließen Sie bei Gleitkommawerten die führende Null vor der Dezimalstelle ein. Beispiel: 0.3, nicht 0.3.

Hinweis

Anwendungen sollten vermeiden, sich auf die Konvertierung von BSTRs in numerische Werte zu verlassen. Wenn die Eigenschaft über einen numerischen Wert verfügt, können Sie den entsprechenden numerischen VARIANT-Typ verwenden.

 

Der Wert einer Eigenschaft kann sich im Laufe der Zeit ändern, sodass die IPropertySetter::AddProp-Methode eine einzelne DEXTER_PARAM Struktur und einen Zeiger auf ein Array von DEXTER_VALUE Strukturen verwendet. Das Array definiert einen Satz von zeitbasierten Werten für die -Eigenschaft. Die Member des Arrays müssen sich in aufsteigender Zeitreihenfolge befinden, und der nValues-Member der DEXTER_PARAM-Struktur muss der Länge des Arrays entsprechen.

Im folgenden Codebeispiel werden Eigenschaftendaten für den SMPTE-Zurücksetzungsübergang erstellt. Der Zurücksetzungscode wird auf 120 festgelegt, wodurch eine ovale Zurücksetzung erstellt wird. Sie legt die Referenzzeit auf 0 (null) fest, was den Beginn des Übergangs angibt.

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();

Dynamisch ändernde Eigenschaften

Nachdem Sie ein Videobearbeitungsprojekt gerendert haben, ist es möglich, die Eigenschaften eines Effekts oder des Übergangsobjekts zu ändern, während das Diagramm ausgeführt wird. Dies ist jedoch nur möglich, wenn Sie Eigenschaften für dieses Objekt vor der Anwendung mit dem Namen IRenderEngine::ConnectFrontEnd festlegen. Wenn dies der Fall ist, können Sie IAMTimelineObj::GetPropertySetter für den Effekt oder den Übergang aufrufen, die Eigenschaften löschen oder ändern, und die Änderungen erfolgen dynamisch, während das Diagramm ausgeführt wird. Während der Änderung kann es visuelle Anomalien geben, daher wird dies nur für die Vorschau empfohlen. Ändern Sie die Eigenschaften nicht, während Sie das Projekt in eine Datei schreiben.

Wenn Sie vor dem Aufruf von ConnectFrontEnd keine Eigenschaften für das Effekt- oder Übergangsobjekt festgelegt haben, können Sie dem Objekt während der Ausführung des Graphen keine Eigenschaften hinzufügen.

Arbeiten mit Effekten und Übergängen