Настройка свойств для эффектов и переходов
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
[Этот API не поддерживается и может быть изменен или недоступен в будущем.]
Многие эффекты и переходы служб редактирования DirectShow поддерживают свойства, управляющие их поведением. Приложение может задать значение свойства с помощью интерфейса IPropertySetter . Базовый эффект или объект перехода должен поддерживать IDispatch для задания свойств. С помощью видеоэффектов и переходов приложение может задать диапазон значений, которые изменяются с течением времени. (Например, можно настроить переход очистки для перемещения между кадром.) При использовании звуковых эффектов значение свойства является статическим и не может изменяться со временем. Единственным исключением является эффект конверта тома , который поддерживает динамическое свойство для уровня тома.
Чтобы задать свойство, выполните следующие действия.
- Создайте экземпляр метода задания свойств (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, указывающий новое значение для свойства. Элемент vt этого VARIANT определяет тип данных свойства . Дополнительные сведения о типе VARIANT см. в разделе Windows SDK.
- rt: время ссылки, когда свойство принимает это значение, относительно времени начала эффекта или перехода. Время начала эффекта или перехода относительно времени начала родительского объекта.
- dwInterp: флаг, указывающий, как свойство изменяется с предыдущего значения на новое. При использовании флага DEXTERF_JUMP свойство мгновенно переходит к новому значению в указанное время. При использовании флага DEXTERF_INTERPOLATE свойство интерполируется линейно из предыдущего значения.
Если для элемента vt задано значение VT_BSTR, метод задания свойств выполняет все необходимые преобразования. Для значений с плавающей запятой включите начальный нуль перед десятичным разрядом. Например, 0,3, а не .3.
Примечание
Приложения не должны полагаться на преобразование из BSTRв числовые значения. Если свойство имеет числовое значение, можно использовать соответствующий числовой тип VARIANT .
Значение свойства может меняться со временем, поэтому метод IPropertySetter::AddProp принимает одну структуру DEXTER_PARAM и указатель на массив DEXTER_VALUE структур. Массив определяет набор значений на основе времени для свойства . Члены массива должны находиться в порядке возрастания времени, а член nValues структуры DEXTER_PARAM должен быть равен длине массива.
В следующем примере кода создаются данные свойств для перехода очистки 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, вы не сможете добавить в него свойства во время работы графа.
Связанные темы