Добавление эффектов и переходных объектов
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
[Этот API не поддерживается и может быть изменен или недоступен в будущем.]
В DES эффект или переход представлен двумя объектами:
- Объект временная шкала представляет эффект или переход в временная шкала. Для эффектов объект временная шкала поддерживает интерфейс IAMTimelineEffect. Для переходов он поддерживает интерфейс IAMTimelineTrans . Оба типа поддерживают интерфейс IAMTimelineObj .
- Вложенный объект — это объект, реализующий обработку данных для эффекта или перехода. Объект временная шкала содержит указатель на подобъект.
Чтобы добавить эффект или переход, выполните следующие действия.
1. Создание объекта временной шкалы
Чтобы создать объект временная шкала, вызовите метод IAMTimeline::CreateEmptyNode. Задайте тип, равный TIMELINE_MAJOR_TYPE_EFFECT для эффекта или TIMELINE_MAJOR_TYPE_TRANSITION для перехода.
В следующем примере создается объект перехода:
IAMTimelineObj *pTransObj = NULL;
pTimeline->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);
2. Указание вложенного объекта
Объект временная шкала выступает в качестве оболочки для другого объекта, называемого подобъектом, который выполняет реальную работу. Вложенный объект реализует преобразование данных, которое создает требуемый эффект или переход. Список переходов и эффектов, поставляемых с DES, см. в разделе Переходы и эффекты.
Чтобы задать подобъект, вызовите метод IAMTimelineObj::SetSubObjectGUID для объекта временная шкала, передав ему идентификатор класса (CLSID) вложенного объекта. DirectShow предоставляет перечислитель для видеоэффектов и переходов видео, который можно использовать для получения ИДЕНТИФИКАТОРа CLSID. Дополнительные сведения см. в разделе Перечисление эффектов и переходов.
В следующем примере задается переход очистки SMPTE в качестве подобъекта :
hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg); // SMPTE Wipe
3. Установка времени начала и остановки
Чтобы задать время начала и остановки, вызовите метод IAMTimelineObj::SetStartStop . Это время относительно времени начала родительского объекта. Эффекты могут перекрываться внутри одного объекта, но переходы — нет.
В следующем примере задается время начала 5 секунд, а время остановки — 10 секунд:
const REFERENCE_TIME ONE_SECOND = 10000000
hr = pTransObj->SetStartStop(5 * ONE_SECOND, 10 * ONE_SECOND);
При отображении перехода ход перехода в каждом кадре вычисляется на основе свойства Progress , которое нормализовано в диапазоне от 0,0 до 1,0. DES использует время начала каждого кадра для вычисления значения хода выполнения. Это означает, что если время остановки перехода равно времени исходной остановки, значение Хода выполнения никогда не достигнет точно 1,0, так как время начала последнего кадра немного превышает время остановки. Чтобы переход достиг значения 1.0, установите время остановки перехода по крайней мере на один кадр раньше, чем время остановки источника.
4. Вставка объекта на временную шкалу
Чтобы вставить объект в временная шкала, вызовите один из следующих методов родительского объекта в зависимости от типа объекта:
- Эффекты: IAMTimelineEffectable::EffectInsBefore
- Переходы: IAMTimelineTransable::TransAdd
В методе IAMTimelineEffectable::EffectInsBefore необходимо указать приоритет эффекта. Если эффекты перекрываются на одном объекте, они применяются в порядке приоритета. Аудиоэффект Volume Envelope является исключением; Дополнительные сведения см. в справочнике по эффекту конверта тома. В композиции все звуковые дорожки смешиваются перед применением звуковых эффектов для этой композиции.
Поскольку переходы не могут перекрываться на одном объекте, они не имеют значения приоритета.
В следующем примере объект перехода добавляется в дорожку:
IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);
pTransable->Release();
В примере запрашивается объект track для интерфейса IAMTimelineTransable перед вызовом AddTrans.
5. Задание свойств
Многие эффекты и переходы поддерживают пользовательские свойства. Дополнительные сведения см. в разделе Настройка свойств для эффектов и переходов.
Пример
В следующем примере кода в дорожку добавляется переход очистки SMPTE. Предполагается, что объект track уже существует в временная шкала.
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();
Связанные темы