EVR:视频窗口上的透明文本输出

时间:2011-04-16 18:39:05

标签: delphi directshow

在表单上的按钮,轨迹栏,面板(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

3 个答案:

答案 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');

电子!!!