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