Окно визуализации DirectShow показывает черный, если график запущен, когда вкладка хоста не видна (TVideoWindow) - PullRequest
3 голосов
/ 08 января 2012

У меня есть приложение Delphi 6, которое использует пакет компонентов DirectShow DSPACK. Он имеет компонент TVideoWindow, который будет отображать изображения из графа фильтра. Компонент TVideoWindow находится на вкладке в компоненте страницы. Если вкладка видна, когда я запускаю График фильтра, видео показывает очень хорошо. Кроме того, я могу переключиться на другую вкладку и вернуться, и видео все еще в порядке. Однако, если я запускаю Фильтр графика, когда вкладка не видна, то при переключении на эту вкладку область видео окна становится черной. Я попытался переключиться на другую вкладку и обратно, свернув форму хоста и восстановив ее, и она осталась черной. Мне интересно, если это проблема жизненного цикла дескриптора окна / компонента? Как я могу это исправить?

1 Ответ

2 голосов
/ 19 января 2012

Эта проблема не возникает при непосредственном использовании 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...