Ajout d’objets d’effet et de transition

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

[Cette API n’est pas prise en charge et peut être modifiée ou indisponible à l’avenir.]

Dans DES, un effet ou une transition est représenté avec deux objets :

  • Un objet chronologie représente l’effet ou la transition au sein du chronologie. Pour les effets, l’objet chronologie prend en charge l’interface IAMTimelineEffect. Pour les transitions, il prend en charge l’interface IAMTimelineTrans . Les deux types prennent en charge l’interface IAMTimelineObj .
  • Le sous-objet est un objet qui implémente le traitement des données pour l’effet ou la transition. L’objet chronologie contient un pointeur vers le sous-objet.

Pour ajouter un effet ou une transition, procédez comme suit.

1. Créer l’objet Chronologie

Pour créer l’objet chronologie, appelez la méthode IAMTimeline::CreateEmptyNode. Définissez le type sur TIMELINE_MAJOR_TYPE_EFFECT pour un effet ou TIMELINE_MAJOR_TYPE_TRANSITION pour une transition.

L’exemple suivant crée un objet de transition :

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

2. Spécifiez le sous-objet

L’objet chronologie agit comme un wrapper pour un autre objet, appelé sous-objet, qui effectue le travail réel. Le sous-objet implémente une transformation de données qui produit l’effet ou la transition souhaité. Pour obtenir la liste des transitions et des effets fournis avec DES, consultez Transitions et effets.

Pour définir le sous-objet, appelez la méthode IAMTimelineObj::SetSubObjectGUID sur l’objet chronologie, en lui transmettant l’identificateur de classe (CLSID) du sous-objet. DirectShow fournit un énumérateur pour les effets vidéo et les transitions vidéo, que vous pouvez utiliser pour obtenir le CLSID. Pour plus d’informations, consultez Énumération des effets et des transitions.

L’exemple suivant définit la transition de réinitialisation SMPTE comme sous-objet :

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

3. Définir les heures de début et d’arrêt

Pour définir les heures de début et d’arrêt, appelez la méthode IAMTimelineObj::SetStartStop . Ces heures sont relatives à l’heure de début de l’objet parent. Les effets peuvent se chevaucher au sein du même objet, mais les transitions ne le peuvent pas.

L’exemple suivant définit l’heure de début sur 5 secondes et l’heure d’arrêt sur 10 secondes :

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

Lorsqu’une transition est rendue, la progression de la transition à chaque image est calculée en fonction d’une propriété Progress , qui est normalisée à une plage comprise entre 0,0 et 1,0. DES utilise l’heure de début de chaque image pour calculer la valeur de progression. Cela signifie que si l’heure d’arrêt de transition est égale à l’heure d’arrêt source, la valeur Progress n’atteint jamais exactement 1,0, car l’heure de début de la dernière image est légèrement supérieure à l’heure d’arrêt. Pour que la transition atteigne la version 1.0, définissez l’heure d’arrêt de la transition sur au moins une image antérieure à l’heure d’arrêt source.

4. Insérer l’objet dans la chronologie

Pour insérer l’objet dans le chronologie, appelez l’une des méthodes suivantes sur le parent, en fonction du type d’objet :

Dans la méthode IAMTimelineEffectable::EffectInsBefore , vous devez spécifier la priorité de l’effet. Lorsque les effets se chevauchent sur le même objet, ils sont appliqués par ordre de priorité. L’effet audio Enveloppe du volume est une exception ; Pour plus d’informations, consultez les informations de référence sur l’effet enveloppe du volume . Dans une composition, toutes les pistes audio sont mélangées avant que les effets audio de cette composition ne soient appliqués.

Étant donné que les transitions ne peuvent pas se chevaucher sur le même objet, elles n’ont pas de valeur de priorité.

L’exemple suivant ajoute l’objet de transition à une piste :

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

L’exemple interroge l’objet track pour l’interface IAMTimelineTransable avant d’appeler AddTrans.

5. Définir les propriétés

De nombreux effets et transitions prennent en charge les propriétés personnalisées. Pour plus d’informations, consultez Définition des propriétés sur les effets et les transitions.

Exemple

L’exemple de code suivant ajoute une transition de réinitialisation SMPTE à une piste. Il suppose que l’objet track existe déjà dans le chronologie.

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

Utilisation des effets et des transitions