好的,我有一个媒体合成,并向其中添加了 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));
有没有一种优雅的方法可以做到这一点,而不必求助于计时器?
我知道这已经太晚了,但是
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());