如何让VideoEffect每次添加到MediaClip时显示不同的数据?

问题描述 投票:0回答:1

好的,我有一个媒体合成,并向其中添加了 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);

现在我希望每个剪辑都显示不同的标题,为了实现此目的,我编写了一个使用 Win2D API 的 DrawTextLayout 方法的自定义视频效果。让我说清楚,我不想用叠加来做到这一点!但由于视频效果是使用工厂设计模式构建的,我将如何在视频效果的每个实例上加载不同的数据?

这是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);       
    }
}

这里,“text”参数每次都应该有不同的值。

添加视频效果时如何指定唯一值?

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

有没有一种优雅的方法可以做到这一点,而不必求助于计时器?

c# uwp video-effects
1个回答
0
投票

我知道这已经太晚了,但是

VideoEffectDefinition
构造函数有一个重载,需要
PropertySet
,这就是你如何用不同的属性初始化每个实例。

PropertySet config = new PropertySet();
config.Add("Pipeline", SelectedPipeline);
var vd = new VideoEffectDefinition(typeof(PipelineEffect).FullName, config);
mc.VideoEffectDefinitions.Add(vd);
var mcp = new MediaComposition();
mcp.Clips.Add(mc);
var ms = MediaSource.CreateFromMediaStreamSource(mcp.GenerateMediaStreamSource());
© www.soinside.com 2019 - 2024. All rights reserved.