如果图形在主机选项卡不可见时启动,DirectShow渲染窗口将显示黑色(TVideoWindow)



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

当直接使用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

最新更新