在表单上的按钮,轨迹栏,面板(panel1 - tpanel +的后继者添加了canvas,align = client), 我通过面板上的EVR(tpanel)启动视频
...
FGraph: IGraphBuilder;
FEVR: IBaseFilter;
FDisplayControl: IMFVideoDisplayControl;
...
OnBtnclik>>
if not Succeeded (CoCreateInstance (CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraph)) then Exit;
if not Succeeded (CoCreateInstance (CLSID_EnhancedVideoRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FEVR)) then Exit;
FGraph. AddFilter (FEVR, 'EVR');
(FEVR as IMFGetService).GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, FDisplayControl);
FDisplayControl. SetVideoWindow (Panel1.Handle);
UpdateEvr; // resize
FGraph. RenderFile (PWideChar ('c:\video\myvideo.avi'), nil);
FDisplayControl. SetAspectRatioMode (0);
...
OntrackbarChange>>
...
with panel1.Canvas do
begin
Font. Color: = cllime;
Brush. Style: = bsclear;
Font. Size: = 20;
TextOut (10, 10, ' TRANSPARENT TEXT ');
end;
显示文字,但闪烁。如何在视频播放过程中推断出panel1上的正常透明文字?
CG.E.Rad 2010
答案 0 :(得分:0)
在轨道栏更改活动期间,您正在绘画,这似乎很奇怪。为什么不用覆盖的Paint
方法绘制?如果所有其他闪烁减少尝试都失败,那么这将允许您进行双缓冲。
那就是说,如果可能的话,我可能会避免自定义绘画。我将使用TLabel
来显示文本,它将作为绘制周期的一部分进行绘制。如果您仍然遇到闪烁问题,那么您可能会发现TStaticText
闪烁的次数少于TLabel
。
答案 1 :(得分:0)
我认为您的问题是由DirectShow引擎在您的标签上绘制视频引起的。当您在轨迹栏事件上绘制标签时,您正在“重新刷新”标签,但视频playpack的刷新率将永远不会与您的轨迹栏事件相同,因此会发生闪烁。我认为没有办法让这种方法起作用。 我建议您查看Summer 2004 DirectX DSK更新中的示例代码“Text”和“Text9”,如以下帖子中所述:http://www.eggheadcafe.com/software/aspnet/32121970/placing-text-overlay-on-direct-show-video.aspx 这些示例代码是用C ++编写的,但将它们翻译成Delphi应该不会太难。
答案 2 :(得分:0)
http://www.delphibbs.com/keylife/iblog_show.asp?xid=33152
程序TEVR9Demo.VideoPlay中的;
第一步 - 添加:
image1.canvas.Brush.Color:=clblack;
image1.Canvas.FloodFill(10,10,clblack,fsborder);
image1.Canvas.FloodFill(10,10,clblack,fsSurface);
image1.Canvas.Font.Color:=cllime;
image1.Canvas.Font.Size:=24;
image1.Canvas.Brush.Style := bsclear;
image1.Canvas.TextOut(10,10,'TRANSPARENT TEXT EXAMPLE');
电子!!!