Как я могу заставить видеоэффект отображать разные данные каждый раз, когда они добавляются в MediaClip?

Хорошо, у меня есть медиакомпозиция и я добавил к ней 3 медиаклипа ...

      MediaComposition composition = new MediaComposition();

MediaClip clip1 = await MediaClip.CreateFromFileAsync(file);
MediaClip clip2 = await MediaClip.CreateFromFileAsync(file);
MediaClip clip3 = await MediaClip.CreateFromFileAsync(file);

composition.Clips.Add(clip1);
composition.Clips.Add(clip2;
composition.Clips.Add(clip3);

Теперь я хочу, чтобы каждый клип отображал отдельный заголовок, и для этого я написал собственный видеоэффект, который использует метод DrawTextLayout Win2D API. Позвольте мне прояснить, я не хочу делать это с наложениями! Но поскольку видеоэффекты создаются с использованием шаблона проектирования фабрики, как мне загружать разные данные для каждого экземпляра видеоэффекта?

Вот ядро ​​MyVideoEffect:

      public void ProcessFrame(ProcessVideoFrameContext context)
{
    using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(canvasDevice, context.InputFrame.Direct3DSurface))
    using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface))
    using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
    {
    CanvasTextFormat textFormat = new CanvasTextFormat();
    CanvasTextLayout textLayout = new CanvasTextLayout(canvasDevice, text, textFormat, width, height);
            ds.DrawTextLayout(someTextLayout, x, y, Colors.Yellow);       
    }
}

Здесь параметр « текст » должен каждый раз иметь другое значение.

Как я могу указать уникальное значение при добавлении видеоэффекта?

      composition.Clips[0].VideoEffectDefinitions.Add(new VideoEffectDefinition(typeof(MyVideoEffect).FullName));
composition.Clips[1].VideoEffectDefinitions.Add(new VideoEffectDefinition(typeof(MyVideoEffect).FullName));
composition.Clips[2].VideoEffectDefinitions.Add(new VideoEffectDefinition(typeof(MyVideoEffect).FullName));

Есть ли элегантный способ сделать это, надеюсь, без использования таймеров?

0 ответов

Другие вопросы по тегам