3

我有一个使用 DirectShow DSPACK 组件套件的 Delphi 6 应用程序。它有一个 TVideoWindow 组件,可以从过滤器图中渲染图像。TVideoWindow 组件位于页面组件的选项卡上。如果在我运行过滤器图表时选项卡可见,则视频显示得很好。另外,我可以切换到另一个选项卡并回来,视频仍然很好。但是,如果我在选项卡不可见时运行过滤器图表,那么当我切换到该选项卡时,视频窗口区域为黑色。我尝试切换到另一个选项卡并返回,最小化主机表单并恢复它,它保持黑色。我想知道这是否是窗口/组件句柄生命周期问题?我怎样才能解决这个问题?

4

1 回答 1

2

直接使用 COM 对象时不会发生此问题,例如将 EVR 设置为随后显示的隐藏面板。我建议花时间摆脱 TVideoWindow 并直接使用 VMR9 和 EVR 等渲染器会更有效率。您不必摆脱 DSPack 来执行此操作,类似于

  FDisplayControl: IMFVideoDisplayControl;
  FEVR: IBaseFilter;
  R: TNormalizedRect;
  R: TRect;

  hr := Succeeded(CoCreateInstance(CLSID_EnhancedVideoRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FEVR));
  if (hr <> S_OK) then
  begin
    showmessage(GetErrorString(hr) + ' (Could not create the enhanced video renderer : ' + inttohex(hr,8) + ')');
    Exit;
  end;
  (FilterGraph as IFilterGraph2).AddFilter().AddFilter(FEVR, PWideChar(WideString('EVR')));
  (FEVR as IMFGetService).GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, FDisplayControl);
  FDisplayControl.SetVideoWindow(Panel.Handle);
  NR.Left := 0;
  NR.Top := 0;
  NR.Right := 1;
  NR.Bottom := 1;
  R := ClientRect;
  FDisplayControl.SetVideoPosition(@nr, @r);
  FDisplayControl.SetAspectRatioMode(MFVideoARMode_None);

注意:以上需要EVR.pas

于 2012-01-19T12:01:34.660 回答