设置效果和切换效果的属性
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
[此 API 不受支持,将来可能会更改或不可用。]
许多 DirectShow 编辑服务 效果和转换支持控制其行为的属性。 应用程序可以使用 IPropertySetter 接口设置属性的值。 基础效果或转换对象必须支持 IDispatch 来设置属性。 借助视频效果和切换效果,应用程序可以设置随时间变化的值范围。 (例如,可以设置擦除过渡以在帧中来回移动。) 使用音频效果时,属性的值是静态的,并且不能随时间而更改。 唯一的例外是 Volume Envelope 效果,它支持音量级别的动态属性。
若要设置属性,请执行以下步骤。
- (CLSID_PropertySetter) 创建属性资源库的实例。
- 使用属性数据填充 DEXTER_PARAM 和 DEXTER_VALUE 结构。 下面讨论了这些结构。
- 将 DEXTER_PARAM 和 DEXTER_VALUE 结构传递给 IPropertySetter::AddProp 方法。
- 对要设置的每个属性重复步骤 2 和 3。
- 将 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 之前未对效果或转换对象设置任何属性,则无法在图形运行时向其添加属性。
相关主题