设置效果和切换效果的属性

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

[此 API 不受支持,将来可能会更改或不可用。]

许多 DirectShow 编辑服务 效果和转换支持控制其行为的属性。 应用程序可以使用 IPropertySetter 接口设置属性的值。 基础效果或转换对象必须支持 IDispatch 来设置属性。 借助视频效果和切换效果,应用程序可以设置随时间变化的值范围。 (例如,可以设置擦除过渡以在帧中来回移动。) 使用音频效果时,属性的值是静态的,并且不能随时间而更改。 唯一的例外是 Volume Envelope 效果,它支持音量级别的动态属性。

若要设置属性,请执行以下步骤。

  1. (CLSID_PropertySetter) 创建属性资源库的实例。
  2. 使用属性数据填充 DEXTER_PARAMDEXTER_VALUE 结构。 下面讨论了这些结构。
  3. DEXTER_PARAMDEXTER_VALUE 结构传递给 IPropertySetter::AddProp 方法。
  4. 对要设置的每个属性重复步骤 2 和 3。
  5. IPropertySetter 接口指针传递给 IAMTimelineObj::SetPropertySetter 方法。

DEXTER_PARAM 结构指定要设置的属性。 它包含以下成员。

  • 名称:属性的名称
  • dispID:保留,必须为零
  • nValues:值数

DEXTER_VALUE 结构指定属性在给定时间的值。 它包含以下成员。

  • v:指定属性的新值的 VARIANT 类型。 此 VARIANT 的 vt 成员定义属性的数据类型。 有关 VARIANT 类型的详细信息,请参阅 Windows SDK。
  • rt:当 属性假定此值时,相对于效果或过渡的开始时间的引用时间。 效果或过渡的开始时间相对于其父对象的开始时间。
  • dwInterp:指定属性如何从以前的值更改为新值的标志。 使用 DEXTERF_JUMP 标志时, 属性在指定时间立即跳转到新值。 使用 DEXTERF_INTERPOLATE 标志时,属性与上一个值线性内插。

如果将 vt 成员设置为 VT_BSTR,则属性资源库将进行任何必要的转换。 对于浮点值,在小数位数前包括前导零。 例如,0.3,而不是 .3。

注意

应用程序应避免依赖从 BSTR到数值的转换。 如果属性具有数值,可以使用适当的数值 VARIANT 类型。

 

属性的值可能会随时间而更改,因此 IPropertySetter::AddProp 方法采用单个 DEXTER_PARAM 结构和指向 DEXTER_VALUE 结构数组的指针。 数组为 属性定义一组基于时间的值。 数组的成员必须按升序时间顺序排列,DEXTER_PARAM 结构的 nValues 成员必须等于数组的长度。

下面的代码示例为 SMPTE 擦除 转换创建属性数据。 它将擦除代码设置为 120,这将创建椭圆擦除。 它将引用时间设置为零,指示转换的开始时间。

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

动态更改属性

呈现视频编辑项目后,可以在图形运行时修改效果或转换对象的属性。 但是,只有在调用 IRenderEngine::ConnectFrontEnd 的应用程序之前在该对象上设置属性时,才可能执行此操作。 如果是这样,则可以对效果或过渡调用 IAMTimelineObj::GetPropertySetter ,清除或修改属性,更改将在图形运行时动态发生。 更改发生时可能存在视觉异常,因此建议仅在预览版中执行此操作。 将项目写入文件时,请勿更改属性。

如果在调用 ConnectFrontEnd 之前未对效果或转换对象设置任何属性,则无法在图形运行时向其添加属性。

使用效果和切换效果