Compartir a través de


Establecer propiedades en efectos y transiciones

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

Muchos efectos y transiciones de DirectShow Edit Services admiten propiedades que controlan su comportamiento. Una aplicación puede establecer el valor de una propiedad mediante la interfaz IPropertySetter . El efecto subyacente o el objeto de transición deben admitir IDispatch para establecer las propiedades. Con los efectos de vídeo y las transiciones, la aplicación puede establecer un intervalo de valores que cambian con el tiempo. (Por ejemplo, puede establecer una transición de borrado para moverse hacia atrás y hacia delante por el marco). Con efectos de audio, el valor de la propiedad es estático y no puede cambiar con el tiempo. La única excepción es el efecto Sobre de volumen , que admite una propiedad dinámica para el nivel de volumen.

Para establecer una propiedad, realice los pasos siguientes.

  1. Cree una instancia del establecedor de propiedades (CLSID_PropertySetter).
  2. Rellene DEXTER_PARAM y DEXTER_VALUE estructuras con los datos de propiedad. Estas estructuras se describen a continuación.
  3. Pase las estructuras de DEXTER_PARAM y DEXTER_VALUE al método IPropertySetter::AddProp .
  4. Repita los pasos 2 y 3 para cada propiedad que desee establecer.
  5. Pase el puntero de interfaz IPropertySetter al método IAMTimelineObj::SetPropertySetter .

La estructura DEXTER_PARAM especifica qué propiedad se va a establecer. Contiene los siguientes miembros.

  • Nombre: nombre de la propiedad
  • dispID: Reservado, debe ser cero
  • nValues: número de valores

La estructura DEXTER_VALUE especifica el valor de una propiedad en un momento dado. Contiene los siguientes miembros.

  • v: tipo VARIANT que especifica un nuevo valor para la propiedad . El miembro vt de esta VARIANT define el tipo de datos de la propiedad . Para obtener más información sobre el tipo VARIANT , consulte Windows SDK.
  • rt: hora de referencia en la que la propiedad asume este valor, en relación con la hora de inicio del efecto o la transición. La hora de inicio del efecto o la transición es relativa a la hora de inicio de su objeto primario.
  • dwInterp: marca que especifica cómo cambia la propiedad del valor anterior al nuevo valor. Con la marca DEXTERF_JUMP, la propiedad salta al instante al nuevo valor en el momento especificado. Con la marca DEXTERF_INTERPOLATE, la propiedad se interpola linealmente desde el valor anterior.

Si establece el miembro vt en VT_BSTR, el establecedor de propiedades realiza las conversiones necesarias. Para los valores de punto flotante, incluya el cero inicial antes de la posición decimal. Por ejemplo, 0.3, no .3.

Nota:

Las aplicaciones deben evitar depender de la conversión de BSTRa valores numéricos. Si la propiedad tiene un valor numérico, use el tipo VARIANT numérico adecuado.

 

El valor de una propiedad puede cambiar con el tiempo, por lo que el método IPropertySetter::AddProp toma una única estructura de DEXTER_PARAM y un puntero a una matriz de estructuras de DEXTER_VALUE . La matriz define un conjunto de valores basados en tiempo para la propiedad . Los miembros de la matriz deben estar en orden de tiempo ascendente y el miembro nValues de la estructura DEXTER_PARAM debe ser igual a la longitud de la matriz.

En el ejemplo de código siguiente se crean datos de propiedad para la transición de borrado de SMPTE . Establece el código de borrado en 120, que crea un borrado ovalado. Establece la hora de referencia en cero, lo que indica el inicio de la transición.

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

Cambiar dinámicamente las propiedades

Después de representar un proyecto de edición de vídeo, es posible modificar las propiedades de un objeto de efecto o transición mientras se ejecuta el gráfico. Sin embargo, esto solo es posible si establece propiedades en ese objeto antes de la aplicación llamada IRenderEngine::ConnectFrontEnd. Si es así, puede llamar a IAMTimelineObj::GetPropertySetter en el efecto o transición, borrar o modificar las propiedades y los cambios se producirán dinámicamente a medida que se ejecuta el grafo. Puede haber anomalías visuales mientras se produce el cambio, por lo que solo se recomienda para la versión preliminar. No cambie las propiedades mientras escribe el proyecto en un archivo.

Si no estableció ninguna propiedad en el objeto de efecto o transición antes de llamar a ConnectFrontEnd, no podrá agregarle propiedades mientras se ejecuta el gráfico.

Trabajar con efectos y transiciones