Agregar objetos Effect y Transition
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
[Esta API no se admite y puede modificarse o no estar disponible en el futuro].
En DES, un efecto o transición se representa con dos objetos:
- Un objeto timeline representa el efecto o la transición dentro de la escala de tiempo. Para efectos, el objeto timeline admite la interfaz IAMTimelineEffect . En el caso de las transiciones, admite la interfaz IAMTimelineTrans . Ambos tipos admiten la interfaz IAMTimelineObj .
- El subobjeto es un objeto que implementa el procesamiento de datos para el efecto o la transición. El objeto timeline contiene un puntero al subobjeto.
Para agregar un efecto o una transición, realice los pasos siguientes.
1. Crear el objeto Timeline
Para crear el objeto timeline, llame al método IAMTimeline::CreateEmptyNode . Establezca el tipo igual a TIMELINE_MAJOR_TYPE_EFFECT para un efecto o TIMELINE_MAJOR_TYPE_TRANSITION para una transición.
En el ejemplo siguiente se crea un objeto de transición:
IAMTimelineObj *pTransObj = NULL;
pTimeline->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);
2. Especificar el Subobjeto
El objeto timeline actúa como contenedor para otro objeto, denominado subobjeto, que realiza el trabajo real. El subobjeto implementa una transformación de datos que genera el efecto o la transición deseados. Para obtener una lista de transiciones y efectos proporcionados con DES, consulte Transiciones y efectos.
Para establecer el subobjeto, llame al método IAMTimelineObj::SetSubObjectGUID en el objeto timeline, pasando el identificador de clase (CLSID) del subobjeto. DirectShow proporciona un enumerador para efectos de vídeo y transiciones de vídeo, que puede usar para obtener el CLSID. Para obtener más información, vea Enumerar efectos y transiciones.
En el ejemplo siguiente se establece la transición de borrado de SMPTE como subobjeto :
hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg); // SMPTE Wipe
3. Establecer las horas de inicio y detención
Para establecer las horas de inicio y detención, llame al método IAMTimelineObj::SetStartStop . Estas horas son relativas a la hora de inicio del objeto primario. Los efectos se pueden superponer dentro del mismo objeto, pero las transiciones no pueden.
En el ejemplo siguiente se establece la hora de inicio en 5 segundos y el tiempo de detención en 10 segundos:
const REFERENCE_TIME ONE_SECOND = 10000000
hr = pTransObj->SetStartStop(5 * ONE_SECOND, 10 * ONE_SECOND);
Cuando se representa una transición, el progreso de la transición en cada fotograma se calcula en función de una propiedad Progress , que se normaliza en un intervalo de 0,0 a 1,0. DES usa la hora de inicio de cada fotograma para calcular el valor de progreso. Esto significa que si el tiempo de detención de la transición es igual al tiempo de detención de origen, el valor progress nunca alcanzará exactamente 1,0, ya que la hora de inicio del último fotograma es ligeramente superior a la hora de detención. Para que la transición alcance 1.0, establezca el tiempo de detención de la transición en al menos un fotograma anterior al tiempo de detención de origen.
4. Insertar el objeto en la escala de tiempo
Para insertar el objeto en la escala de tiempo, llame a uno de los métodos siguientes en el elemento primario, en función del tipo de objeto:
- Efectos: IAMTimelineEffectable::EffectInsBefore
- Transiciones: IAMTimelineTransable::TransAdd
En el método IAMTimelineEffectable::EffectInsBefore , debe especificar la prioridad del efecto. Cuando los efectos se superponen en el mismo objeto, se aplican en orden de prioridad. El efecto de audio sobre volumen es una excepción; consulte la referencia de efecto sobre de volumen para obtener más información. Dentro de una composición, todas las pistas de audio se mezclan antes de que se apliquen los efectos de audio para esa composición.
Dado que las transiciones no se pueden superponer en el mismo objeto, no tienen un valor de prioridad.
En el ejemplo siguiente se agrega el objeto de transición a una pista:
IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);
pTransable->Release();
En el ejemplo se consulta el objeto track de la interfaz IAMTimelineTransable antes de llamar a AddTrans.
5. Establecer propiedades
Muchos efectos y transiciones admiten propiedades personalizadas. Para obtener información, vea Establecer propiedades en efectos y transiciones.
Ejemplo
En el ejemplo de código siguiente se agrega una transición de borrado de SMPTE a una pista. Se supone que el objeto de seguimiento ya existe en la escala de tiempo.
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();
Temas relacionados