EVR: прозрачный текст на видеоокне - PullRequest
2 голосов
/ 16 апреля 2011

На форме кнопка, трекбар, панель (панель1 - добавлен наследник от 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; 

Текст отображается, но мерцает.Как вывести обычный прозрачный текст на панели 1 во время воспроизведения видео?

CG.E.Rad 2010

Ответы [ 3 ]

0 голосов
/ 18 апреля 2011

Я думаю, что ваша проблема вызвана движком DirectShow, который рисует видео поверх вашего ярлыка.Вы «обновляете» свой ярлык, когда рисуете его на событии панели треков, но частота обновления видео-плейпака никогда не будет такой же, как события вашего трека-бара, поэтому возникает мерцание.Я думаю, что нет никакого способа заставить этот подход работать.Я рекомендую взглянуть на примеры кода «Текст» и «Текст9» в обновлении DirectX DSK летом 2004 года, как указано в следующем сообщении: http://www.eggheadcafe.com/software/aspnet/32121970/placing-text-overlay-on-direct-show-video.aspx Эти примеры кодов написаны на C ++, но это не должно быть слишкомсложно перевести их на Delphi.

0 голосов
/ 25 апреля 2011

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

e !!!

0 голосов
/ 16 апреля 2011

Мне кажется странным, что вы рисуете во время события смены полосы.Почему бы вам не рисовать переопределенным методом Paint?Это позволило бы вам выполнить двойную буферизацию, если бы все другие попытки уменьшения мерцания потерпели неудачу.Я бы использовал TLabel для отображения текста, и он будет рисовать как часть цикла рисования.Если у вас все еще были проблемы с мерцанием, вы можете обнаружить, что TStaticText меньше, чем TLabel.

...