Hinzufügen von Effekt- und Übergangsobjekten

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

In DES wird ein Effekt oder ein Übergang mit zwei Objekten dargestellt:

  • Ein Zeitleiste-Objekt stellt den Effekt oder den Übergang innerhalb der Zeitleiste dar. Für Effekte unterstützt das Zeitleiste-Objekt die IAMTimelineEffect-Schnittstelle. Für Übergänge unterstützt sie die IAMTimelineTrans-Schnittstelle . Beide Typen unterstützen die IAMTimelineObj-Schnittstelle .
  • Das Unterobjekt ist ein Objekt, das die Datenverarbeitung für den Effekt oder den Übergang implementiert. Das Zeitleiste -Objekt enthält einen Zeiger auf das Unterobjekt.

Führen Sie die folgenden Schritte aus, um einen Effekt oder einen Übergang hinzuzufügen.

1. Erstellen des Zeitachsenobjekts

Rufen Sie zum Erstellen des Zeitleiste-Objekts die IAMTimeline::CreateEmptyNode-Methode auf. Legen Sie den Typ auf TIMELINE_MAJOR_TYPE_EFFECT für einen Effekt oder TIMELINE_MAJOR_TYPE_TRANSITION für einen Übergang fest.

Im folgenden Beispiel wird ein Übergangsobjekt erstellt:

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

2. Angeben des Unterobjekts

Das Zeitleiste-Objekt fungiert als Wrapper für ein anderes Objekt, das als Unterobjekt bezeichnet wird, das die eigentliche Arbeit ausführt. Das Unterobjekt implementiert eine Datentransformation, die den gewünschten Effekt oder Übergang erzeugt. Eine Liste der mit DES bereitgestellten Übergänge und Effekte finden Sie unter Übergänge und Effekte.

Um das Unterobjekt festzulegen, rufen Sie die IAMTimelineObj::SetSubObjectGUID-Methode für das Zeitleiste-Objekt auf, und übergeben Sie ihr den Klassenbezeichner (CLSID) des Unterobjekts. DirectShow stellt einen Enumerator für Videoeffekte und Videoübergänge bereit, mit dem Sie die CLSID abrufen können. Weitere Informationen finden Sie unter Aufzählen von Effekten und Übergängen.

Im folgenden Beispiel wird der SMPTE-Zurücksetzungsübergang als Unterobjekt festgelegt:

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

3. Festlegen der Start- und Stoppzeiten

Um die Start- und Stoppzeiten festzulegen, rufen Sie die IAMTimelineObj::SetStartStop-Methode auf. Diese Zeiten sind relativ zur Startzeit des übergeordneten Objekts. Effekte können sich innerhalb desselben Objekts überlappen, übergänge jedoch nicht.

Im folgenden Beispiel wird die Startzeit auf 5 Sekunden und die Stoppzeit auf 10 Sekunden festgelegt:

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

Wenn ein Übergang gerendert wird, wird der Fortschritt des Übergangs an jedem Frame basierend auf einer Progress-Eigenschaft berechnet, die auf einen Bereich von 0,0 bis 1,0 normalisiert wird. DES verwendet die Startzeit jedes Frames, um den Statuswert zu berechnen. Dies bedeutet, wenn die Übergangsstoppzeit gleich der Ausgangsstoppzeit ist, wird der Statuswert nie genau 1,0 erreichen, da die Startzeit des letzten Frames etwas höher als die Stoppzeit ist. Damit der Übergang 1.0 erreicht, legen Sie die Übergangsstoppzeit auf mindestens einen Frame vor der Ausgangsstoppzeit fest.

4. Einfügen des Objekts in die Zeitachse

Um das Objekt in den Zeitleiste einzufügen, rufen Sie abhängig vom Objekttyp eine der folgenden Methoden für das übergeordnete Objekt auf:

In der IAMTimelineEffectable::EffectInsBefore-Methode müssen Sie die Priorität des Effekts angeben. Wenn sich Effekte auf dasselbe Objekt überschneiden, werden sie in der Reihenfolge der Priorität angewendet. Der Audioeffekt "Volume Envelope" ist eine Ausnahme. Weitere Informationen finden Sie in der Referenz zu Volume Envelope Effect . Innerhalb einer Komposition werden alle Audiospuren gemischt, bevor die Audioeffekte für diese Komposition angewendet werden.

Da sich Übergänge auf demselben Objekt nicht überschneiden können, haben sie keinen Prioritätswert.

Im folgenden Beispiel wird das Übergangsobjekt einem Track hinzugefügt:

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

Das Beispiel fragt das Track-Objekt für die IAMTimelineTransable-Schnittstelle ab, bevor AddTrans aufgerufen wird.

5. Festlegen von Eigenschaften

Viele Effekte und Übergänge unterstützen benutzerdefinierte Eigenschaften. Weitere Informationen finden Sie unter Festlegen von Eigenschaften für Effekte und Übergänge.

Beispiel

Im folgenden Codebeispiel wird einer Spur ein SMPTE-Zurücksetzungsübergang hinzugefügt. Es wird davon ausgegangen, dass das Trackobjekt bereits im Zeitleiste vorhanden ist.

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

Arbeiten mit Effekten und Übergängen